从列表中删除包含在其他元组中的重复元组,其中包括列表

3

我有一个包含元组的列表:

managed_list = [ ('a', [1,2]), ('a', [1,2]), ('b', [2,2]), ('b', [2,2])]

需要获取:

managed_list = [ ('a', [1,2]), ('b', [2,2]) ]

我尝试了:

seen = set()
[[n for n in x if n not in seen and not seen.add(n)] for x in managed_list]

获取:

TypeError: unhashable type: 'list'
2个回答

3

没错,在一个set中,你不能使用list或包含list(或其他不可哈希类型)的结构。如果不改变输入结构,你可以使用itertools.groupby,并且只需丢弃重复项的迭代器:

import itertools
uniques = [x[0] for x in itertools.groupby(sorted(managed_list))]

顺便提一下,如果没有无法哈希的键问题(例如,如果列表是元组),则您的表达式可以简化为:

list(set(managed_list))

在这种情况下,您不需要在列表理解中添加额外的代码。

需要注意的是,itertools.groupby 要求输入全局排序才能正常工作,否则它将在连续元素上工作。 - Maciej Gol

1
你也可以使用collections.OrderedDict来移除重复的键。
>>> from collections import OrderedDict
>>> OrderedDict([ ('a', [1,2]), ('a', [1,2]), ('b', [2,2]), ('b', [2,2])]).items()
[ ('a', [1,2]), ('b', [2,2]) ]

请记住,在出现重复键的情况下,最右边的条目将包含在输出中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接