使用列表中包含的列表删除重复的元组

时间:2014-08-13 06:44:46

标签: python set tuples

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

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 个答案:

答案 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]) ]

请记住,如果重复键,最右边的条目将是输出中包含的条目。