【问题标题】:Python: how to find common values in three listsPython:如何在三个列表中找到共同值
【发布时间】:2015-01-21 06:52:33
【问题描述】:

我尝试找到三个不同列表的通用值列表:

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]

Br

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    使用集:

    >>> 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 那样使用过滤列表解析来解决这个问题的简单方法是为 a 的每个元素迭代列表 bc,因此对于更长的列表,效率会低很多。

    【讨论】:

    • 如果类型很重要,别忘了把结果变成一个列表!
    【解决方案2】:
    out = [x for x in a if x in b and x in c]
    

    是一种快速简单的解决方案。这将构造一个列表out,其中包含来自a 的条目,如果这些条目位于bc 中。

    对于更大的列表,你想看看@poke提供的答案

    【讨论】:

      【解决方案3】:

      对于那些仍然遇到这个问题的人,可以使用 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)
      

      【讨论】:

        猜你喜欢
        • 2016-07-06
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        相关资源
        最近更新 更多