协调与列表列表中的列表的比较

时间:2014-02-12 03:19:24

标签: python list indexing

所以我想在如此安排的协调之间进行比较“

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)

但是我不确定这是否会起作用,即使它确实如此,也会非常慢。我想知道是否有人知道更清洁,更有效的方法吗?

请记住,这是一个生成程序,任何和所有数据都是可变的。

谢谢,

1 个答案:

答案 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))