Python嵌入式列表与迭代的迭代

时间:2014-12-24 04:18:14

标签: python python-2.7 comparison iteration

检查列表是否在嵌套列表中,完整迭代或使用in的最快方法是什么?

鉴于

A = [['Yes','2009','Me'],['Yes','2009','You'],['No','2009','You']]
B = [['No','2009','Me'],['Yes','2009','You'],['No','2009','You']]

计算A和B之间重复的数量。

我看到要么迭代所有元素:

for i in range(len(A)):
    for j in range(len(B)):
        if A[i] == B[j]:
            count+=1

或者使用in with one element iteration:

for i in range(len(A)):
    if A[i] in B:
        count+=1

A和B的实际长度超过100,000个数组,每个包含4个元素,是否有任何特定的功能或策略可以有效地进行这种比较?

根据我的数据,选项1为绿色,选项2为蓝色,qqvc的答案为红色,user1245262答案为绿松石(它位于底部,速度非常快,线性复杂)y轴为秒,x轴为数字在每个列表中比较4个元素数组。

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以尝试使用套装。考虑:

>>> A = [['Yes','2009','Me'],['Yes','2009','You'],['No','2009','You']]
>>> B = [['No','2009','Me'],['Yes','2009','You'],['No','2009','You']]

sets需要hashable元素,因此您需要将列表转换为元组。我假设您的列表都按照特定顺序排列,因此[' dog',2,'鼠标']将始终以这种方式显示,而不是[' #39; mouse',2,' dog']。然后,

>>> AA = set(map(tuple,A))
>>> BB = set(map(tuple,B))

然后,

>>> BB.intersection(AA)
set([('No', '2009', 'You'), ('Yes', '2009', 'You')])

因为您似乎只想要交叉点的大小,

>>> len(BB.intersection(AA))
2

这可能比你的循环更快,但你必须检查它。

答案 1 :(得分:0)

选项z:

sum(thing in B for thing in A)

选项y:

sum(itertools.starmap(operator.eq, itertools.product(A,B)))