我如何获得两个相同的python列表的元素?

时间:2012-08-30 15:01:16

标签: python list

  

可能重复:
  Common elements comparison between 2 lists

我有两个列表:

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

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

结果:

[Apples, Bananas]

2 个答案:

答案 0 :(得分: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'])

答案 1 :(得分: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']

因此,通常情况下,集合解决方案更好,因为它更有效,因为通常您不需要重复元素。但是,如果您想保留订单,这是可行的方法。 (如果您想保留顺序而没有重复项,则可以使用此方法,然后删除重复项,具体取决于您是希望保留较早的副本还是稍后的副本。)

相关问题