Как получить неуникальные элементы списка после преобразования его set()'ом?
Знаем, что при list(set(spisok))
получаем новый список из старого, который будет только из уникальных элементов.
А как же получить те элементы, которые были исключены?
Желательно по одному уникальному (т.е. если было 3 каких-то одинаковых элемента, то на выходе только один получить, чтобы показать, какой именно был неуникальным).
И желательно без циклов по всем элементам (ибо список может быть на десятки тысяч элементов).
TemaKam, смотрите. У этого алгоритма сложность порядка O(N). Там фактически два прохода по всем эkементам в худшем случае, но O(const*N) читается эквивалентным O(N).
Почему так? Потому что Counter построен на основе словаря (Hash Map). За счет оптимизаций и математической магии с хешированием амортизированная сложность вставки в такую структуру данных будет порядка O(1). Очевидно, что это нужно проделать N раз. Потом ещё в худшем случае N раз, чтобы перебрать все неповторяющиеся элементы.
Это не проблема.
Если бы у вас список был изначально отсортированным, то его можно очистить от лишних вам элементов тоже за O(N), да за один проход. Если список не сортированный, то придётся его сперва осортировать, что займёт у вас в среднем O(N*lnog(N)) и это хуже, чем вариант выше.
Короче, не морочьте голову.
Кстати, вы можете и за один проход выдать все дублирующиеся элементы:
def filterdup(items):
c = Counter()
for item in items:
if c[item] == 1:
yield item
c[item] += 1
Но фактически вы этим ничего не выиграете. Думаю этот вариант даже медленнее будет.
Сергей Паньков, понятно, спасибо.
Думал, может, при преобразовании в set можно было бы вытащить удаляемые элементы, но если нельзя, то значит только Вашим способом.