Как я могу проверить, есть ли в списке дубликаты, и вернуть новый список без дубликатов?
Переведено автоматически
Ответ 1
Общий подход к получению уникальной коллекции элементов заключается в использовании set. Наборы представляют собой неупорядоченные коллекции различных объектов. Чтобы создать набор из любого итерируемого элемента, вы можете просто передать его встроенной set() функции. Если вам позже снова понадобится настоящий список, вы можете аналогичным образом передать set в list() функцию.
Следующий пример должен охватывать все, что вы пытаетесь сделать:
Как вы можете видеть из результата примера, исходный порядок не поддерживается. Как упоминалось выше, сами наборы представляют собой неупорядоченные коллекции, поэтому порядок теряется. При преобразовании набора обратно в список создается произвольный порядок.
Поддержание порядка
Если для вас важен порядок, то вам придется использовать другой механизм. Очень распространенным решением для этого является использование OrderedDict для сохранения порядка ключей во время вставки.:
Начиная с Python 3.7, встроенный словарь гарантированно сохраняет порядок вставки, поэтому вы также можете использовать его напрямую, если используете Python 3.7 или более позднюю версию (или CPython 3.6):
>>> list(dict.fromkeys(t)) [1, 2, 3, 5, 6, 7, 8]
Обратите внимание, что это может повлечь за собой некоторые накладные расходы на создание сначала словаря, а затем списка из него. Если вам на самом деле не нужно сохранять порядок, вам часто лучше использовать set , особенно потому, что это дает вам гораздо больше операций для работы. Ознакомьтесь с этим вопросом для получения более подробной информации и альтернативных способов сохранения порядка при удалении дубликатов.
Наконец, обратите внимание, что как для set, так и для OrderedDict/dict решений требуется, чтобы ваши элементы были хэшируемыми. Обычно это означает, что они должны быть неизменяемыми. Если вам приходится иметь дело с элементами, которые не являются хэшируемыми (например, объектами списка), то вам придется использовать медленный подход, при котором вам в основном придется сравнивать каждый элемент с любым другим элементом во вложенном цикле.
Ответ 2
В Python 2.7 появился новый способ удаления дубликатов из итерируемого объекта с сохранением его исходного порядка::
В Python 3.5 OrderedDict реализован на языке Си. Мои тайминги показывают, что на данный момент это самый быстрый и сокращенный из различных подходов для Python 3.5.
В Python 3.6 обычный dict стал упорядоченным и компактным. (Эта функция сохраняется для CPython и PyPy, но может отсутствовать в других реализациях). Это дает нам новый быстрый способ дедупликации с сохранением порядка:
Это однострочный: list(set(source_list)) сделает свое дело.
A set - это то, что не может иметь дубликатов.
Обновление: подход с сохранением порядка состоит из двух строк:
from collections import OrderedDict OrderedDict((x, True) for x in source_list).keys()
Здесь мы используем тот факт, что OrderedDict запоминает порядок вставки ключей и не изменяет его при обновлении значения в конкретном ключе. Мы вставляем True как значения, но мы могли бы вставлять что угодно, значения просто не используются. (set работает очень похоже на dict с игнорируемыми значениями тоже.)
Ответ 4
>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8] >>> t [1, 2, 3, 1, 2, 5, 6, 7, 8] >>> s = [] >>> for i in t: if i notin s: s.append(i) >>> s [1, 2, 3, 5, 6, 7, 8]