假设我有列表[[1,2,3],[4,5,6],[3,2,1]],列表的第一个和最后一个元素(也是列表)实际上是相同 - 它们包含相同的数字集,只是顺序不同。如果我想创建一个接收列表列表的函数,并删除那些重复的列表元素(在这种情况下,删除[1,2,3]或[3,2,1]并保留剩余的一个),我该怎么做?
谢谢
答案 0 :(得分:4)
使用set
和frozenset
。
设置仅存储唯一项目,并且它们是无序的。
>>> {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]]