Удаление дублирования в списке - PullRequest
0 голосов
/ 08 июля 2019

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

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 ]

4 голосов
/ 08 июля 2019

Проблема в том, что списки в списке не являются хешируемыми и поэтому не могут быть добавлены в 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 для того же эффекта.

2 голосов
/ 08 июля 2019

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

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')]]
0 голосов
/ 08 июля 2019

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

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')]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...