Python:如何在三个列表中查找常用值

Mag*_*nar 11 python python-2.7 python-3.x

我尝试找到三个不同列表的常用值列表:

a = [1,2,3,4]
b = [2,3,4,5]
c = [3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

当然我自然会尝试使用and运算符,但是我只是得到list表达式中last的值:

>> a and b and c
out: [3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

有没有找到常用值列表的简短方法:

[3,4]
Run Code Online (Sandbox Code Playgroud)

BR

pok*_*oke 37

使用集:

>>> a = [1, 2, 3, 4]
>>> b = [2, 3, 4, 5]
>>> c = [3, 4, 5, 6]
>>> set(a) & set(b) & set(c)
{3, 4}
Run Code Online (Sandbox Code Playgroud)

或者乔恩建议:

>>> set(a).intersection(b, c)
{3, 4}
Run Code Online (Sandbox Code Playgroud)

使用集合的好处是您不需要重复迭代原始列表.每个列表迭代一次以创建集合,然后集合相交.

使用筛选列表理解作为Geotob解决此问题的天真方法将迭代列表bc每个元素a,因此对于更长的列表,这将效率低得多.

  • 如果类型很重要,请不要忘记将结果转换为列表! (3认同)

Geo*_*tob 9

out = [x for x in a if x in b and x in c]
Run Code Online (Sandbox Code Playgroud)

是一个快速而简单的解决方案.如果这些条目在和中,则构造一个out带有条目的列表.abc

对于较大的列表,您需要查看@poke提供的答案


小智 5

对于那些仍然遇到这个问题的人,可以使用 numpy 来使用:

np.intersect1d(array1, array2)
Run Code Online (Sandbox Code Playgroud)

这适用于列表和 numpy 数组。它可以在 的帮助下扩展到更多数组functools.reduce,或者可以简单地对多个数组重复。

from functools import reduce
reduce(np.intersect1d, (array1, array2, array3))
Run Code Online (Sandbox Code Playgroud)

或者

new_array = np.intersect1d(array1, array2)
np.intersect1d(new_array, array3)
Run Code Online (Sandbox Code Playgroud)