Необходимо удалить парные элементы в списке

Знаю про функцию set(), но она оставляет число. То есть мне нужно удалить оба элемента. Например, [1, 2, 3, 3, 2] необходимо преобразовать в [1].


Ответы (3 шт):

Автор решения: entithat

Для каждого элемента проверяем сколько раз он повторяется в списке. Если 1, то оставляем его.

[x for x in a if a.count(x) == 1]  # [1]
→ Ссылка
Автор решения: Xander

Можно посчитать сколько раз встречается каждое число с помощью Counter

from collections import Counter

data = [1, 2, 3, 3, 2]

counter = Counter(data)

uniqs = []

for x, num in counter.items():
    if num == 1:
        uniqs.append(x)
        
print(uniqs)

Это самое эффективное по скорости работы решение для общего случая. Впрочем, если нам известно про входные данные что-то особенное, то можно найти ещё более эффективные решения.

Например, если как в вашем случае, повторяющиеся элементы всегда парные, а уникальный элемент только один, то можно использовать хак с "исключающим или" и найти уникальный элемент за линейное время:

from itertools import accumulate
from operator import xor


data = [1, 2, 3, 3, 2]

uniq = accumulate(data, xor)

print(list(uniq)[-1])
→ Ссылка
Автор решения: Кирилл Малышев

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

from functools import reduce
l = [1, 2, 3, 3, 2, 4, 5, 5, 5, 5, 5, 2, 2]
res = reduce(lambda s, x: s ^ {x}, l, set())

Результат:

{1, 4, 5}
→ Ссылка