我尝试找到三个不同列表的常用值列表:
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]
溴
答案 0 :(得分:34)
使用套装:
>>> a = [1, 2, 3, 4]
>>> b = [2, 3, 4, 5]
>>> c = [3, 4, 5, 6]
>>> set(a) & set(b) & set(c)
{3, 4}
或者乔恩建议:
>>> set(a).intersection(b, c)
{3, 4}
使用集合的好处是您不需要重复迭代原始列表。每个列表迭代一次以创建集合,然后集合相交。
使用过滤后的列表推导解决此问题的天真方法,如Geotob所做的那样,会为b
的每个元素迭代列表c
和a
,因此对于更长的列表,这将是一个效率低下。
答案 1 :(得分:9)
out = [x for x in a if x in b and x in c]
是一种快速而简单的解决方案。如果这些条目位于out
和a
中,则会构建包含b
条目的列表c
。
对于较大的列表,您需要查看@poke
提供的答案答案 2 :(得分:0)
对于仍然在这个问题上磕磕绊绊的人,可以使用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)