我有一个包含元组的列表:
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'
答案 0 :(得分:3)
是的,您无法在list
中使用list
或包含set
(或其他不可变类型)的结构。在不改变输入结构的情况下,您可以使用itertools.groupby
,然后通过重复项放弃迭代器:
import itertools
uniques = [x[0] for x in itertools.groupby(sorted(managed_list))]
顺便说一下,如果不是因为不可用的密钥问题(例如,如果列表是元组),那么您的表达式可以简化为:
list(set(managed_list))
您不需要列表推导中的额外代码。
答案 1 :(得分: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]) ]
请记住,如果重复键,最右边的条目将是输出中包含的条目。