如何删除包含不同顺序元素的重复列表?

时间:2014-12-08 09:25:00

标签: python list function python-2.7 duplicates

假设我有列表[[1,2,3],[4,5,6],[3,2,1]],列表的第一个和最后一个元素(也是列表)实际上是相同 - 它们包含相同的数字集,只是顺序不同。如果我想创建一个接收列表列表的函数,并删除那些重复的列表元素(在这种情况下,删除[1,2,3]或[3,2,1]并保留剩余的一个),我该怎么做?

谢谢

3 个答案:

答案 0 :(得分:4)

使用setfrozenset

设置仅存储唯一项目,并且它们是无序的。

>>> {3, 1, 2} == {2, 1, 3}
True

但是他们只能存储不可变项目,这就是为什么我们还需要frozenset

>>> {set([1, 2, 3])}
Traceback (most recent call last):
  File "<ipython-input-16-ddc0311520e7>", line 1, in <module>
    {set([1, 2, 3])}
TypeError: unhashable type: 'set'

>>> {frozenset([1, 2, 3])}
set([frozenset([1, 2, 3])])

<强>演示:

>>> lst = [[1,2,3],[4,5,6],[3,2,1]]
>>> seen = set()
>>> [x for x in lst if frozenset(x) not in seen and not seen.add(frozenset(x))]
[[1, 2, 3], [4, 5, 6]]

答案 1 :(得分:3)

将列表中的每个元素转换为集合,然后转换为元组并形成新集合以获得您期望的结果。

data = [[1,2,3],[4,5,6],[3,2,1]]
print(set(tuple(set(item)) for item in data))
# {(4, 5, 6), (1, 2, 3)}

我们可以在这里使用frozenset,就像这样

print(set(frozenset(item) for item in data))
# {frozenset({1, 2, 3}), frozenset({4, 5, 6})}

答案 2 :(得分:1)

另一种方法是使用map:

map(list, set(map(frozenset, lst)))

这会给你[[1,2,3],[4,5,6]]

它基本上做了什么,是将freezeset应用于lst。我们使用frozenset因为set只存储不可变项。 做地图(frozenset,lst),给我们:     [frozenset([1,2,3]),frozenset([4,5,6]),frozenset([1,2,3])] 从那,应用集合,我们得到:     set([frozenset([1,2,3]),frozenset([4,5,6])])

和映射列表给我们[[1,2,3],[4,5,6]]