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



所以我想在像这样排列的坐标之间进行比较

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中的每个序列调用list。

像这样:

for i in lista:
for q in listb:
for z in q:
my_function(i,z)

然而,我不确定这是否会奏效,即使奏效,也会非常缓慢。我想知道是否有人知道一种更清洁、更高效的方法?

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

谢谢,

您尝试的方法会很慢。你可以肯定。

然而,如果您的"my_function"使itens变得复杂,那么这将是一种方法——即,对所有列表项运行一个循环,对另一个列表上的所有项运行另一个循环。这就是强制O(m X n),随着你有更多的项目,它将变得缓慢。

然而,如果你只想检查listb中的哪些项目在lista中,并将它们放在listc中,有快速的方法可以做到这一点。

最合适的方法是使用sets:Python中的一个无序容器,它可以比需要顺序搜索的普通列表更快地检查元素是否包含在其中。

但是,如果你只想比较两个列表中的元素,b在详细说明如何使用集合之前,重要的是你要理解Python中的列表和其他序列类型是直接可比较的-不需要特殊的函数来比较它们,也不需要逐项比较:

>>> [1, 1] == [1, 1]
True

即使对于列表中列表的深层结构也是如此(或字典、元组、集合和列表):Python将递归比较复杂数据结构中的所有元素仅使用CCD_ 2运算符。

现在,回到场景:你的问题的最终答案可能只是:(这只是同时比较两个列表——因为lista里面有几个列表,您需要一个额外的循环来一次拾取其中的每一个以创建集合和交叉点-但对于坐标列表中的每一个,它将只是一个循环内部lista-不是其中每个项目的循环)

seta = set(tuple(item) for item in lista) 
setb = set(tuple(item) for item in listb)
listc = list(setb.intersection(seta))