Сообщить об ошибке.

Удаление дубликатов из списка Python с сохранением очередности

Чтобы избавиться от дублирующих значений в списке Python, первое, что приходит в голову, это воспользоваться свойством множества set хранить только уникальные значения.

>>> lst = [9, 5, 3, 1, 7, 6, 5, 3, 1, 4, 3, 2, 1]
>>> list(set(lst))
# [1, 2, 3, 4, 5, 6, 7, 9]

Из примера видно, что получены только уникальные значения исходного списка lst. Большой недостаток такого способа удаления дубликатов заключается в том, что итоговый список теряет порядок очередности значений, что следует из определения множества (множество - это неупорядоченная последовательность различных хешированных объектов).

Так как же удалить дубликаты в списке и при этом сохранить порядок элементов списка? В этом могут помочь следующие два свойства словаря Python dict:

  1. Ключи словаря не могут иметь дублирующие значения.
  2. Словари в Python сохраняют очерёдность (помнят порядок) вставки ключей.

Для создания словаря Python из последовательности (списка list) воспользуемся генератором словаря:

>>> lst = [9, 5, 3, 1, 7, 6, 5, 3, 1, 4, 3, 2, 1]
>>> d = {key:0 for key in lst}
>>> d
# {9: 0, 5: 0, 3: 0, 1: 0, 7: 0, 6: 0, 4: 0, 2: 0}

# теперь просто получим ключи словаря 
>>> list(d)
# [9, 5, 3, 1, 7, 6, 4, 2]

Из примера видно что полученный список (без дубликатов) сохранил очерёдность значений, как и ожидалось.

Еще проще использовать метод dict.fromkeys(), который создаёт словарь из последовательности ключей.

>>> lst = [9, 5, 3, 1, 7, 6, 5, 3, 1, 4, 3, 2, 1]
>>> d = dict.fromkeys(lst)
>>> d
# {9: None, 5: None, 3: None, 1: None, 7: None, 6: None, 4: None, 2: None}

# теперь просто получим ключи словаря 
>>> list(d)
# [9, 5, 3, 1, 7, 6, 4, 2]