【问题标题】:Compare two nested lists and return common elements比较两个嵌套列表并返回公共元素
【发布时间】:2017-09-23 05:01:55
【问题描述】:

我有两个列表如下。

list1 = [["cup", "mug"], ["happy", "joy", "smile"], ["trees", "bushes"]]
list2 = [["cat", "dog"], ["trees", "bushes"], ["cup", "mug"]]

现在,我想返回两个列表中的共同元素。

Common elements = [["trees", "bushes"], ["cup", "mug"]]

我尝试了以下代码:

print(list(set(list1).intersection(list2)))

但是,它不起作用。有什么建议吗?

【问题讨论】:

    标签: python list set comparison set-intersection


    【解决方案1】:

    您可能正在寻找:

    In [773]: [list(x) for x in set(map(tuple, list1)).intersection(map(tuple, list2))]
    Out[773]: [['trees', 'bushes'], ['cup', 'mug']]
    

    您也可以使用& 运算符(集合的交集运算符):

    In [778]: [list(x) for x in set(map(tuple, list1)) & set(map(tuple, list2))]
    Out[778]: [['trees', 'bushes'], ['cup', 'mug']]
    

    您的代码不起作用的原因是您没有将每个单独的列表元素转换为set 可以散列的东西。例如,tuples 是可散列的,但 lists 不是,因此您的方法给出:

    In [774]: set(list1)
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-774-a09f7eaac729> in <module>()
    ----> 1 set(list1)
    
    TypeError: unhashable type: 'list'
    

    但是,将每个元素转换为 tuple 允许它们被散列:

    In [775]: set(map(tuple, list1))
    Out[775]: {('cup', 'mug'), ('happy', 'joy', 'smile'), ('trees', 'bushes')}
    

    原因是tuples 是不可变的容器。

    【讨论】:

      【解决方案2】:

      更简单的方法是

      [elem for elem in list1 if elem in list2]
      

      你可以得到

      >>> [elem for elem in list1 if elem in list2]
      [['cup', 'mug'], ['trees', 'bushes']]
      

      感谢 Python 支持 in 运算符用于 list

      您的问题的原因是,list 是可变的,因此它不能是可散列的,导致列表列表无法转换为集合。正如@cᴏʟᴅsᴘᴇᴇᴅ所说,你可以把它变成tuple

      [list(x) for x in set(map(tuple, list1)).intersection(map(tuple, list2))]
      

      这两种方法都有效,但由于内部算法不同,它们的性能有所不同。但我认为很难说哪个更快,这可能取决于您的数据。

      短版的一定好处是,如果你需要这个功能,输出数据将与list1具有相同的顺序。

      【讨论】:

        猜你喜欢
        • 2021-11-13
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        相关资源
        最近更新 更多