【问题标题】:Intersection of two nested lists in PythonPython中两个嵌套列表的交集
【发布时间】:2015-04-05 21:35:20
【问题描述】:

我对嵌套列表有疑问。我想用 python 语言计算两个嵌套列表的交集的长度。我的清单组成如下:

list1 = [[1,2], [2,3], [3,4]]
list2 = [[1,2], [6,7], [4,5]]
output_list = [[1,2]]

如何计算两个列表的交集?

【问题讨论】:

  • 我已经尝试过该解决方案,但它对我不起作用!
  • 必须一个子列表的所有元素都匹配另一个子列表的所有元素才能成为交集吗?这里的输出是什么?
  • @JacopoTerrinoni:该页面上有列表列表的解决方案,例如[val for val in list1 if val in list2]。 (见this answer。)
  • 我不能使用这个方法,因为 set() 函数不适用于嵌套列表,只能用于简单列表

标签: list python-2.7 intersection


【解决方案1】:

我认为有两种合理的方法可以解决这个问题。

如果您的顶级列表中的项目不多,您可以简单地检查其中一个中的每个子列表是否存在于另一个中:

intersection = [inner_list for inner in list1 if inner_list in list2]

in 运算符将测试是否相等,因此可以按预期找到具有相同内容的不同列表对象。然而,这不是很有效,因为列表成员资格测试必须遍历所有子列表。也就是说,它的性能是O(len(list1)*len(list2))。但是,如果您的列表很长,可能会花费比您想要的更多的时间。

一种更渐近有效的替代方法是将内部列表转换为tuples,并将顶级lists 转换为sets。您实际上不需要为此编写任何循环,因为 mapset 类型的 & 运算符将为您处理这一切:

intersection_set = set(map(tuple, list1)) & set(map(tuple, list2))

如果您需要您的结果是lists 的list,您当然可以将tuples 的set 转换回lists 的list

intersection_list = list(map(list, intersection_set))

【讨论】:

    【解决方案2】:

    在 python 中使用集合怎么样?

    >>> set1={(1,2),(2,3),(3,4)}
    >>> set2={(1,2),(6,7),(4,5)}
    >>> set1 & set2
    set([(1, 2)])
    >>> len(set1 & set2)
    1
    

    【讨论】:

    • 我也尝试在列表中使用 set() 函数,但无法使用!
    【解决方案3】:
    import json
    
    
    
    list1 = [[1,2], [2,3], [3,4]]
    list2 = [[1,2], [6,7], [4,5]]
    
    list1_str = map(json.dumps, list1)
    list2_str = map(json.dumps, list2)
    
    output_set_str = set(list1_str) & set(list2_str)
    
    output_list = map(json.loads, output_set_str)
    
    print output_list
    

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多