【问题标题】:How do i get the elements of two python lists that are the same? [duplicate]我如何获得两个相同的python列表的元素? [复制]
【发布时间】:2012-08-30 15:01:16
【问题描述】:

可能重复:
Common elements comparison between 2 lists

我有两个列表:

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

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

结果:

[Apples, Bananas]

【问题讨论】:

    标签: python list


    【解决方案1】:
    >>> 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'])
    

    【讨论】:

    • 次要:如果您使用的是.intersection,则无需将第二个设置为一组。 (如果您使用的是&,则可以这样做。)
    • +1 比我的回答更有效率
    【解决方案2】:

    原答案:

    [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']
    

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

    【讨论】:

    • 这个结构对我来说是新的,但它仍然更受欢迎。你能帮我解释一下吗?
    • 这是一个列表推导式,通过检查最终列表的元素是否在 list2 中来过滤它们。
    • 虽然不是特别有效。对于小型输入列表可能没问题(事实上,在某个阈值下它甚至可能比其他解决方案执行得更好,因为没有散列或排序开销),但最坏的情况是,为 list1 的每个元素迭代所有 list2。
    • 性能说明:这看起来像一个循环,但实际上是两个。 in 运算符需要为 list1 中的每个元素循环 list2 中的元素。如果列表很大,这可能会成为一项昂贵的操作。 (如果list2 是一个集合,则成员资格测试的计算成本会更低。)
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多