У меня есть следующий список,

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'

Интересно, что я делаю не так и как я могу это исправить?

-1
Wiliam 8 Июл 2019 в 18:32

3 ответа

Лучший ответ

Проблема заключается в том, что списки в списке не являются hashable и поэтому не могут быть добавлены в dict (как ключи) или set. Вместо этого вы можете преобразовать их в tuples или в repr, если они могут иметь вложенные списки, и использовать те в качестве ключа, а сами списки в качестве значений в 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 к тому же эффекту.

4
tobias_k 8 Июл 2019 в 15:44

Перед установкой убедитесь, что вы преобразовали список в кортеж. Затем вы можете преобразовать его обратно в список:

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
Andrej Kesely 8 Июл 2019 в 15:34

Попробуй это,

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')]]
-1
Kushan Gunasekera 8 Июл 2019 в 15:42