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

tar*_*sch 2 python list

可能重复:
2个列表之间的公共元素比较

我有两个列表:

[Apples, Bananas, Pears]
[Kiwis, Bananas, Apples]
Run Code Online (Sandbox Code Playgroud)

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

结果:

[Apples, Bananas]
Run Code Online (Sandbox Code Playgroud)

Ale*_*yev 12

>>> set(["Apples", "Bananas", "Pears"]).intersection(["Kiwis", "Bananas", "Apples"])
set(['Bananas', 'Apples'])
>>> list(_)
['Bananas', 'Apples']
Run Code Online (Sandbox Code Playgroud)

这相当于:

>>>set(["Apples", "Bananas", "Pears"]) & set(["Kiwis", "Bananas", "Apples"])
set(['Bananas', 'Apples'])
Run Code Online (Sandbox Code Playgroud)

  • ......或者只是`&` (3认同)
  • 轻微:如果你使用`.intersection`,你不需要将第二个变为一组.(如果你使用`&`,你会这样做.) (2认同)

Mat*_*ams 10

原答案:

[x for x in list1 if x in list2]
Run Code Online (Sandbox Code Playgroud)

在回答关于保留订单的评论问题时:

列表理解只是一个简写版本

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

通过这个扩展版本,可以更容易地看到发生了什么.输出列表list1与要list2删除的元素完全相同.所以它将保持秩序list1.例如,如果list1 = [1,2,3]list2 = [3,2,5],则列表推导的输出将是[2,3].如果列表的位置像这样颠倒了

[x for x in list2 if x in list1]
Run Code Online (Sandbox Code Playgroud)

那么顺序list2将保留在输出中,给我们[3,2].

此外,在可能不希望的副作用中,这意味着该方法将包含重复的元素list1.例如:

>>> [x for x in [1,2,3,3,3] if x in [2,3]]
[2, 3, 3, 3]
Run Code Online (Sandbox Code Playgroud)

所以对于你的例子,这发生了:

>>> [fruit for fruit in ["Apples", "Bananas", "Pears"] if fruit in ["Kiwis", "Bananas", "Apples"]]
['Apples', 'Bananas']
Run Code Online (Sandbox Code Playgroud)

但如果列表被翻转,则输出反转:

>>> [fruit for fruit in ["Kiwis", "Bananas", "Apples"] if fruit in ["Apples", "Bananas", "Pears"]]
['Bananas', 'Apples']
Run Code Online (Sandbox Code Playgroud)

因此,一般来说,集合解决方案更好,因为它更有效,因为通常您不需要重复元素.但是,如果您想保留订单,这是可行的方法.(如果要保留顺序并且没有重复项,则可以使用此方法然后去除重复项,具体取决于您是希望保留较早的副本还是后续副本.)

  • 性能说明:这看起来像一个循环,但它实际上是两个.`in`运算符需要为`list1`中的每个元素循环`list2`中的元素.如果列表很大,这可能会成为一项昂贵的操作.(如果`list2`是一个集合,测试成员资格的计算成本会低一些.) (3认同)
  • 但它并不是特别有效.它对于小输入列表来说可能很好(实际上它甚至可能比在某个阈值下的其他解决方案表现更好,因为没有散列或排序开销),但是在最坏的情况下,你会为​​list1的每个元素迭代所有list2. (2认同)