Как удалить повторяющиеся элементы из списка, используя понимание списка?
Как удалить повторяющиеся элементы из списка, используя понимание списка? У меня есть следующий код:
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)