Как удалить повторяющиеся элементы из списка, используя понимание списка?

Как удалить повторяющиеся элементы из списка, используя понимание списка? У меня есть следующий код:

a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
b = []
b = [item for item in a if item not in b]

но он не работает, просто создает идентичный список. Почему он создает идентичный список?

Ответ 1

Он создает идентичный список, поскольку b не содержит элементов во время выполнения. Что бы вы хотели этого:

>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = []
>>> [b.append(item) for item in a if item not in b]
[None, None, None, None, None, None, None, None]
>>> b
[1, 2, 3, 5, 9, 6, 8, 7]

Ответ 2

Если вы не против использовать другую технику, кроме понимания списка, вы можете использовать для этого набор:

>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = list(set(a))
>>> print b
[1, 2, 3, 5, 6, 7, 8, 9]

Ответ 3

Причина, по которой список не изменился, заключается в том, что b начинается пустым. Это означает, что if item not in b всегда True. Только после того, как был создан список, этот новый непустой список назначается переменной b.

Ответ 4

Используйте keys в dict, построенный со значениями в a в качестве его ключей.

b = dict([(i, 1) for i in a]).keys()

Или используйте набор:

b = [i for i in set(a)]

Ответ 5

Используйте groupby:

>>> from itertools import groupby
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> [k for k, _ in groupby(sorted(a, key=lambda x: a.index(x)))]
[1, 2, 3, 5, 9, 6, 8, 7]

Оставьте ключевой аргумент, если вам неважно, в каком порядке значение сначала появилось в исходном списке, например

>>> [k for k, _ in groupby(sorted(a))]
[1, 2, 3, 5, 6, 7, 8, 9]

Вы можете сделать несколько интересных вещей с помощью groupby. Чтобы идентифицировать элементы, которые появляются несколько раз:

>>> [k for k, v in groupby(sorted(a)) if len(list(v)) > 1]
[2, 3, 5, 8]

Или создать частотный словарь:

>>> {k: len(list(v)) for k, v in groupby(sorted(a))}
{1: 1, 2: 3, 3: 4, 5: 4, 6: 1, 7: 1, 8: 2, 9: 1}

В модуле itertools есть несколько очень полезных функций: chain, tee и product, чтобы назвать несколько

Ответ 6

>>> a = [10,20,30,20,10,50,60,40,80,50,40,0,100,30,60]
>>> [a.pop(a.index(i, a.index(i)+1)) for i in a if a.count(i) > 1]
>>> print(a)