问题描述
我有一个函数,该函数使用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
通过这种方式,您不必为每个查询遍历整个矩阵。