2

可能重复:
两个列表之间的常见元素比较

我有两个列表:

[Apples, Bananas, Pears]
[Kiwis, Bananas, Apples]

我只想获取两个列表共享的元素。为此,python中必须有一些内置函数。

结果:

[Apples, Bananas]
4

2 回答 2

12
>>> set(["Apples", "Bananas", "Pears"]).intersection(["Kiwis", "Bananas", "Apples"])
set(['Bananas', 'Apples'])
>>> list(_)
['Bananas', 'Apples']

这相当于:

>>>set(["Apples", "Bananas", "Pears"]) & set(["Kiwis", "Bananas", "Apples"])
set(['Bananas', 'Apples'])
于 2012-08-30T15:03:09.417 回答
10

原答案:

[x for x in list1 if x in list2]

针对有关保留顺序的评论问题:

该列表理解只是

intersection = []
for x in list1:
    if x in list2: #Note that using 'in' involves looping over list2
        intersection.append(x)

使用此扩展版本,可以更轻松地查看正在发生的事情。输出列表与删除list1的元素完全相同。list2所以它将保留 的顺序list1。例如,如果list1 = [1,2,3]list2 = [3,2,5],列表推导的输出将是[2,3]。如果列表的位置像这样颠倒

[x for x in list2 if x in list1]

然后 的顺序list2将保留在输出中,给我们[3,2].

此外,在可能不受欢迎的副作用中,这意味着此方法将包含 的重复元素list1。例如:

>>> [x for x in [1,2,3,3,3] if x in [2,3]]
[2, 3, 3, 3]

因此,对于您的示例,会发生这种情况:

>>> [fruit for fruit in ["Apples", "Bananas", "Pears"] if fruit in ["Kiwis", "Bananas", "Apples"]]
['Apples', 'Bananas']

但是如果列表被翻转,那么输出就会反转:

>>> [fruit for fruit in ["Kiwis", "Bananas", "Apples"] if fruit in ["Apples", "Bananas", "Pears"]]
['Bananas', 'Apples']

因此,一般来说,集合解决方案更好,因为它更有效,而且您通常不想要重复的元素。但是,如果你想保持秩序,这是要走的路。(如果您想保留顺序并且没有重复项,您可以使用此方法,然后删除重复项,具体取决于您希望保留较早的重复项还是后面的重复项。)

于 2012-08-30T15:01:54.713 回答