【问题标题】:remove duplicates from 2d lists regardless of order [duplicate]无论顺序如何,从二维列表中删除重复项
【发布时间】:2019-04-01 23:50:35
【问题描述】:

我有一个二维列表

a = [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]

我怎样才能得到结果:

result = [[1,2],[1,3],[2,3]]

无论内部列表的顺序如何,都将删除重复项。

【问题讨论】:

  • Removing permutations from a list of tuples 的可能重复项——顺便说一句,这是一个比迄今为止发布的答案更好的解决方案。
  • list(map(list, (set(tuple(sorted(l)) for l in a)))),借用了副本中的逻辑

标签: python python-3.x list duplicates


【解决方案1】:

尝试使用集合来跟踪您看到的列表:

from collections import Counter

a = [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2], [1, 2, 1]]

seen = set()
result = []
for lst in a:
    current = frozenset(Counter(lst).items())
    if current not in seen:
        result.append(lst)
        seen.add(current)

print(result)

哪些输出:

[[1, 2], [1, 3], [2, 3], [1, 2, 1]]

注意:由于列表不能散列,您可以存储 Counter 对象的frozensets 以检测无序重复。这完全消除了排序的需要。

【讨论】:

    【解决方案2】:
    In [3]: b = []
    In [4]: for aa in a:
    ...:     if not any([set(aa) == set(bb) for bb in b if len(aa) == len(bb)]):
    ...:         b.append(aa)
    In [5]: b
    Out[5]: [[1, 2], [1, 3], [2, 3]]
    

    【讨论】:

    • 如何处理[[1,2,1], [1,2]]
    • 很好,我没有考虑过。需要为此添加另一个过滤器。
    【解决方案3】:

    虽然我喜欢 @RoadRunner 的 FrozenSet 想法(集合很有用,它们让您无需重新发明轮子/试图比开发 Python 的人更聪明即可找到独特的元素),您也可以尝试这样的事情,其中您只是想删除每个元素的反向子列表。缺点是如果你有一堆非重复的,它可能会过于昂贵:

    a = [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
    
    result = a.copy()
    for x in result:
      try:
        result.remove([x[-1::-1])
      except:
        pass
    
    >>> [[1, 2], [1, 3], [2, 3]]
    

    这应该适用于任意大小的子列表。

    【讨论】:

      【解决方案4】:

      “设置”概念在这里会派上用场。您拥有的列表(包含重复项)可以转换为 Set(永远不会包含重复项)。 在此处查找有关 Set 的更多信息:Set

      例子:

      l = ['foo', 'foo', 'bar', 'hello']
      

      可以直接创建集合:

      s = set(l)
      

      现在如果你检查列表的内容

      print(s)
      >>> {'foo', 'bar', 'hello'}
      

      Set 可以以这种方式处理任何可迭代的对象! 希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 2010-10-03
        相关资源
        最近更新 更多