我试图找到三个不同列表的共同值列表:
a = [1,2,3,4]
b = [2,3,4,5]
c = [3,4,5,6]
当然,我自然会尝试使用“and”运算符,但这样做只会得到表达式中最后一个“list”的值。>> a and b and c
out: [3,4,5,6]
有没有一种简便的方法来找到共同的值列表:
[3,4]
溴
我试图找到三个不同列表的共同值列表:
a = [1,2,3,4]
b = [2,3,4,5]
c = [3,4,5,6]
当然,我自然会尝试使用“and”运算符,但这样做只会得到表达式中最后一个“list”的值。>> a and b and c
out: [3,4,5,6]
有没有一种简便的方法来找到共同的值列表:
[3,4]
溴
使用集合:
>>> a = [1, 2, 3, 4]
>>> b = [2, 3, 4, 5]
>>> c = [3, 4, 5, 6]
>>> set(a) & set(b) & set(c)
{3, 4}
或者像Jon建议的那样:
>>> set(a).intersection(b, c)
{3, 4}
使用集合的好处是您不需要重复迭代原始列表。每个列表只需迭代一次即可创建集合,然后交集集合。
使用过滤列表推导式来解决这个问题的朴素方法(如Geotob所做)将为a
的每个元素迭代列表b
和c
,因此对于较长的列表,这将效率低下得多。
out = [x for x in a if x in b and x in c]
这是一个快速简单的解决方案。它使用a
中的条目构建一个列表out
,如果这些条目在b
和c
中,则将其加入列表。
对于更大的列表,您应该查看@poke提供的答案。
对于仍然遇到这个问题的人,使用numpy可以使用以下方法:
np.intersect1d(array1, array2)
此方法适用于列表和numpy数组。可以借助functools.reduce
将其扩展到更多的数组,或者可以将其重复应用于多个数组。
from functools import reduce
reduce(np.intersect1d, (array1, array2, array3))
或者
new_array = np.intersect1d(array1, array2)
np.intersect1d(new_array, array3)