[英]Remove duplicated lists in list of lists in Python
我在这里看到一些非常相关的问题,但他们的答案对我不起作用。 我有一个列表列表,其中一些子列表被重复,但它们的元素可能是无序的。 例如
g = [[1, 2, 3], [3, 2, 1], [1, 3, 2], [9, 0, 1], [4, 3, 2]]
根据我的问题,输出应该是自然的:
g = [[1,2,3],[9,0,1],[4,3,2]]
我尝试过使用set
但只删除那些相同的列表(我认为它应该可行,因为根据定义,集合没有顺序)。 我访问过的其他问题只有列表完全重复或重复的示例如下: Python:如何删除列表列表中的重复列表? 。 现在,输出顺序(列表和子列表)不是问题。
(ab)使用列表comp的副作用版本:
seen = set()
[x for x in g if frozenset(x) not in seen and not seen.add(frozenset(x))]
Out[4]: [[1, 2, 3], [9, 0, 1], [4, 3, 2]]
对于那些不喜欢以这种方式使用副作用的人(与我不同):
res = []
seen = set()
for x in g:
x_set = frozenset(x)
if x_set not in seen:
res.append(x)
seen.add(x_set)
将frozenset
集添加到集合中的原因是您只能将可散列对象添加到set
,并且vanilla set
不可散列。
如果您不关心列表和子列表的顺序(并且子列表中的所有项目都是唯一的):
result = set(map(frozenset, g))
如果子列表可能有重复项,例如[1, 2, 1, 3]
frozenset(sublist)
[1, 2, 1, 3]
那么您可以使用tuple(sorted(sublist))
frozenset(sublist)
tuple(sorted(sublist))
而不是frozenset(sublist)
来从子列表中删除重复项。
如果要保留子列表的顺序:
def del_dups(seq, key=frozenset):
seen = {}
pos = 0
for item in seq:
if key(item) not in seen:
seen[key(item)] = True
seq[pos] = item
pos += 1
del seq[pos:]
例:
del_dups(g, key=lambda x: tuple(sorted(x)))
我会将列表中的每个元素转换为冻结集(可以清除),然后创建一个集合以删除重复项:
>>> g = [[1, 2, 3], [3, 2, 1], [1, 3, 2], [9, 0, 1], [4, 3, 2]]
>>> set(map(frozenset, g))
set([frozenset([0, 9, 1]), frozenset([1, 2, 3]), frozenset([2, 3, 4])])
如果需要将元素转换回列表:
>>> map(list, set(map(frozenset, g)))
[[0, 9, 1], [1, 2, 3], [2, 3, 4]]
如何使用roippi frozenset这样使用:
>>> g = [list(x) for x in set(frozenset(i) for i in [set(i) for i in g])]
[[0, 9, 1], [1, 2, 3], [2, 3, 4]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.