检查列表是否在嵌套列表中,完整迭代或使用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个元素数组。
答案 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)))