删除列表中的重复项

时间:2019-07-08 15:32:31

标签: python list

我有以下列表

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'

我想知道我在做什么错,我该如何纠正?

3 个答案:

答案 0 :(得分:4)

问题在于列表中的列表不能可散列,因此无法将其添加到dict(作为键)或set中。相反,您可以将它们转换为tuplesrepr(如果它们可以具有嵌套列表),并使用 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')]]