所以我想在如此安排的协调之间进行比较“
def my_function(lista, listb):
....
lista = [ [ [x,y], [x,y], [x,y], [x,y] ] ]
listb = [ [x,y], [x,y], [x,y], [x,y] ]
listc = []
在这种情况下,我一直只是这样做来调用我的函数:
index = [0,1,2,3,4,5,6,7,8,9]
for i in index:
temp = my_function(lista[0][i], listb[i])
listc.append(temp)
但是我已经达到了这样的程度,我现在正在向lista添加多个列表序列,并希望在listb中为每个序列调用一个列表。
像这样:for i in lista:
for q in listb:
for z in q:
my_function(i,z)
但是我不确定这是否会起作用,即使它确实如此,也会非常慢。我想知道是否有人知道更清洁,更有效的方法吗?
请记住,这是一个生成程序,任何和所有数据都是可变的。
谢谢,
答案 0 :(得分:0)
你正在尝试的方法会很慢。你可以肯定的。
但是,如果你的“my_function”使itens变得复杂,那么它就是要走的路 - 即运行一个包含所有列表项的循环,另一个循环包含另一个列表中的所有项。这是强制性的O(m X n),因为你有更多的物品,它会变得很慢。
但是,如果您只想检查listb中的哪些项目在lista中并在listc中包含这些项目, 有快速的方法。
最合适的方法是使用sets
:Python中的无序容器,它可以检查元素是否包含在其中,比普通列表要快得多,这需要顺序搜索。
但是如果你想要的只是比较两个列表中的元素,那么在拼写如何使用集合之前,重要的是要理解Python中的列表和其他序列类型是直接可比的 - 不需要特殊的功能比较它们,或逐项比较:
>>> [1, 1] == [1, 1]
True
即使列表中列表的深层结构也是如此
(或字典,元组,集合和列表彼此):Python
将递归地比较复杂数据结构中的所有元素
只需使用==
运算符。
现在,回到集合:
问题的最终答案可能只是:
(这只是一次比较两个列表 - 因为你的
lista
里面有几个列表,你需要一个额外的循环
一次挑选每一个来创建集合和交集 -
但对于每个坐标列表,它只是一个循环
在lista
内 - 不是每个项目的循环)
seta = set(tuple(item) for item in lista)
setb = set(tuple(item) for item in listb)
listc = list(setb.intersection(seta))