在地图功能中使用多个迭代器

问题描述

我有一个函数,该函数使用for循环在由字符组成的二维列表中查找char的起始位置。

def findStartPos(char,arr):
    for y,sublist in enumerate(arr):
        pos = []
        if char in sublist:
            x = arr[y].index(char)
            pos.append(x)
            pos.append(y)
            return pos
    return -1

如何使用地图功能翻译此内容?如果可能的话。考虑到我要同时迭代arr [y]的y和arr [y] [x]的子列表。另外,如果还有其他优化代码方法也会有所帮助。

我还没有尝试过任何东西,因为我不知道如何前进。

解决方法

是的,您可以使用map获得所需的结果。我最小化了您的原始功能,以使您了解如何实现此功能。

from functools import partial

def mapper(char,idx_arr):
    idx,subarr = idx_arr
    if char in subarr:
        x = sublist.index(char)
        return x,idx
    return -1,-1. # same return type for consistency

arr = [["f","d"],["d","c"]]
char = "c"

p = partial(mapper,char)
next(filter(lambda x: sum(x) > -1,map(p,enumerate(arr))))
>> (1,1)
,

我已经对此进行了评论,但这是一个代码片段,可能会对您有所帮助。我主要坚持对您的变量命名进行一些改进:

def findStartPos(char,arr):
    for y,sublist in enumerate(arr):
        x = sublist.find(char) # finds the first instance of char in sublist and returns its index,if it can't find any it returns -1
        if x != -1:
            return [x,y] # here you can just return a list in stead of creating an empty list and appending x and y,this looks cleaner
    return -1

现在,我不确定在这里实现map函数是否有意义,但是也许其他人可以帮上忙。

,

我相信您正在寻找优化,而不仅仅是字典的应用?

提问时间!是否有比线性搜索更快的算法来搜索数组中的char?除非对数组进行排序,否则答案通常是“否”。因此,您必须检查查询的所有索引。没有更快的解决方案。将矩阵转换为集合列表并不会对其进行优化,因为列表转换集的时间复杂度为O(n)。

同样,如果您有一个矩阵但有多个查询,则可以对矩阵中的每个唯一元素进行预处理,并在遍历矩阵时对其进行存储,并分别存储每个元素的位置(索引)对于所有查询,只需一次即可。

我的实现:

from collections import defaultdict #to make life easier
def preprocess(matrix):
  dic_to_store_index=defaultdict(list)
  for i in range(len(matrix)):
          for m in range(len(matrix[i])):
                    dic_to_store_index[matrix[i][m]].append((i,m)) #Storing tuples of indexes
                    
  return dic_to_store_index

def find(dic,char):
  return dic[char][0]

matrix=[[5,6,5,4,2,5],[2,2],7,1]] #Your matrix here
dic=preprocess(matrix) #preprocess only once for  all queries
char=2 #lets find first occurance of  2 in this matrix
print(find(dic,char)) # 0{1) operation
char=7 #another query
print(find(dic,char)) #O(1) complexity and no need to traverse matrix

enter image description here

通过这种方式,您不必为每个查询遍历整个矩阵。