从2d列表中删除重复项,无论顺序如何

时间:2018-10-29 04:44:03

标签: python python-3.x list duplicates

我有一个二维列表

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

如何获得结果:

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

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

4 个答案:

答案 0 :(得分: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个对象的冻结集来检测顺序少的重复项。这完全消除了排序的需要。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

虽然我喜欢@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]]

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

答案 3 :(得分:-1)

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

示例:

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

可以直接创建一个集合:

s = set(l)

现在是否检查列表的内容

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

Set将以这种方式与任何可迭代对象一起使用! 希望对您有帮助!