如何在Python中的两个列表的交集中选择元素

时间:2015-04-05 02:32:21

标签: python list

作为一个简单的例子:

list1 = ['a', 'b', 'c']
list2 = ['a', 'stack', 'overflow']
for i in list1 and list2:
    print i

这将打印list2中的所有元素。为什么是这样?我怎样才能打印两个列表中的元素?

1 个答案:

答案 0 :(得分:6)

如果您的列表可能很大,最好将它们转换为集合并使用它们的交叉点:

list1 = ['a', 'b', 'c']
list2 = ['a', 'stack', 'overflow']

for i in set(list1).intersection(set(list2)):
    print i

如果您想重复迭代该交集,请将其保存在自己的变量(intersect = set(list1).intersection(set(list2)))中。

你也可以使用:

for i in list 1:
    if i in list2:
        print i

但是在列表中使用in来检查成员资格的问题是它可以是O(n)操作,因此总的来说,你的循环变为O(n ^ 2)。 OTOH,在in上使用set作为成员身份是O(1),所以速度要快得多。

至于您的原始问题,当您执行for i in list1 and list2时,它被解释为for i in (list1 and list2),如果list1不为空,则list1 and list2的值只是list2,因此您最终仅迭代第二个列表。