上周我在接受采访时被问到这个问题,但我没有得到答案(无论如何都是正确答案)。比如你有一个列表A,其中包含以下元素[1,3,5,7,9,10]然后你有列表B,它有以下元素:[3,4,5,6,7],并且您想知道列表B中哪些元素在列表A中。我的答案是:
for item in listA:
for item1 in listB:
if item1 == item:
put item1 in some third list
但我知道这很糟糕,因为说listA是一百万个元素,而listB是十万个,这个解决方案只是垃圾。
没有两个列表的迭代,实现这样的事情的最佳方法是什么?
答案 0 :(得分:6)
set(listA) & set(listB)
最简单。
答案 1 :(得分:2)
我建议将它们转换为集合并进行交叉:
setA = set(listA)
setB = set(listB)
setA.intersection(setB)
编辑:请注意,这将删除两个列表中的所有重复元素。因此,如果我们有listA = [1,1,2,2,3]
和listB = [1,1,2,3]
,那么交集将只是set([1,2,3])
。此外,对于最坏情况估计,这将与列表理解一样慢O(n * m)
,其中n和m是列表的相应长度。然而,平均情况要好得多O(n) + O(m) + O(min(m,n)) == O(max(m,n))
。
答案 2 :(得分:1)
使用list comprehension并使用in运算符测试成员资格:
[i for i in lista if i in listb]
会产生:
[3, 5, 7]
或者,可以使用set操作并查看两个列表(转换为集合)的交集是什么。
答案 3 :(得分:1)
好吧我也可以在混音中输入过滤器
filter(lambda x: x in listb,lista)
答案 4 :(得分:0)
您可以使用套装(首选):
listC = list(set(listA) & set(listB))
或列表理解:
listC = [i for i in listA if i in listB]