我有以下列表
test=[[('x1', 'x2', 'x3', 'x4', 'x5'),
('x6','x7')],
[('x1', 'x2', 'x3', 'x4', 'x5'),
('x6','x7')],
[('x1', 'x2', 'x3', 'x4', 'x5'),
('x6','x7','x8')]]
我想删除重复的元素,以便得到:
[[('x1', 'x2', 'x3', 'x4', 'x5'),
('x6','x7')],
[('x1', 'x2', 'x3', 'x4', 'x5'),
('x6','x7','x8')]]
我尝试过:
list(dict.fromkeys(test))
和
list(set(test))
对于这两种方法,我都会遇到以下错误:
TypeError: unhashable type: 'list'
我想知道我在做什么错,我该如何纠正?
答案 0 :(得分:4)
问题在于列表中的列表不能可散列,因此无法将其添加到dict
(作为键)或set
中。相反,您可以将它们转换为tuples
或repr
(如果它们可以具有嵌套列表),并使用 theose 作为键,并使用列表本身作为a中的值dict
。
>>> d = {tuple(x): x for x in test}
>>> list(d.values())
[[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6', 'x7')],
[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6', 'x7', 'x8')]]
除了set
之外,这还保留了列表的原始顺序(至少在较新的Python版本中)。对于较旧的版本,可以使用collections.OrderedDict
来达到相同的效果。
答案 1 :(得分:2)
在插入设置之前,请确保将列表转换为元组。然后,您可以将其转换回列表:
test=[[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6','x7')],
[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6','x7')],
[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6','x7','x8')]]
from pprint import pprint
pprint([list(i) for i in set(tuple(i) for i in test)])
打印:
[[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6', 'x7', 'x8')],
[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6', 'x7')]]
答案 2 :(得分:-1)
尝试一下
print([i for n,i in enumerate(test) if i not in test[:n]])
输出:
[[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6', 'x7')],
[('x1', 'x2', 'x3', 'x4', 'x5'), ('x6', 'x7', 'x8')]]