Обычный подход для получения уникальной коллекции предметов заключается в использовании set
. Наборы являются неупорядоченными коллекциями различных объектов. Чтобы создать набор из любого итератора, вы можете просто передать его во встроенную функцию set()
. Если позже вам снова понадобится реальный список, вы также можете передать набор в функцию list()
.
Следующий пример должен охватывать все, что вы пытаетесь сделать:
>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> t
[1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> list(set(t))
[1, 2, 3, 5, 6, 7, 8]
>>> s = [1, 2, 3]
>>> list(set(t) - set(s))
[8, 5, 6, 7]
Как видно из примера, исходный заказ не поддерживается . Как упоминалось выше, сами наборы являются неупорядоченными коллекциями, поэтому порядок теряется. При преобразовании набора обратно в список создается произвольный порядок.
Ведение заказа
Если порядок важен для вас, вам придется использовать другой механизм. Очень распространенным решением для этого является использование OrderedDict
, чтобы сохранить порядок ключей во время вставки:
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Начиная с Python 3.7 , встроенный словарь гарантированно будет поддерживать порядок вставки, поэтому вы также можете использовать его напрямую, если вы используете Python 3.7 или более позднюю версию (или CPython 3.6):
>>> list(dict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Обратите внимание, что это требует дополнительных усилий для создания словаря, а затем создания списка из него. Если вам на самом деле не нужно сохранять порядок, вам лучше использовать набор. Проверьте этот вопрос для более подробной информации и альтернативных способов сохранить порядок при удалении дубликатов.
Наконец, обратите внимание, что как для set
, так и для OrderedDict
/ dict
требуется, чтобы ваши элементы были хешируемыми . Обычно это означает, что они должны быть неизменными. Если вам приходится иметь дело с элементами, которые не могут быть хешируемыми (например, списочные объекты), то вам придется использовать медленный подход, при котором вам придется сравнивать каждый элемент с каждым другим элементом во вложенном цикле.