Как удалить из списка повторяющиеся элементы, сохранив порядок?
array = ['item1', 'item2', 'item3', 'item3', 'item1', 'item3', 'item2', 'item4']
Обычно используют преобразование в множество и обратно
unq = list(set(array))
Но такой способ ломает порядок элементов.
Правильный алгоритм выглядит так:
🔸Способ 0
unq = []
for item in array:
if item not in unq:
unq.append(item)
Теперь посмотрим как это записать короче
🔸 Способ 1
Создаем пустой список и в простом генераторе сначала проверяем а потом добавляем элемент если его еще нет в списке.
unq = []
[unq.append(item) for item in array if item not in unq]
🔸 Способ 2
Аналогичный, но с помощью set().
_set = set()
unq = [x for x in array if x not in _set and not _set.add(x)]
Здесь вторая проверка это хитрый "костыль". Функция на самом деле ничего не возвращает, просто нам надо её вызвать сразу после первой проверки, если она вернула True. Ответ функции add() инвертируем с помощью not чтобы оба условия сработали.
🔸 Способ 3
В одну строку как обычно с помощью set, но с последующей сортировкой для восстановления порядка.
unq = sorted(list(set(array)), key=array.index)
🔸Способ 4
Здесь используем тот факт, что в словаре два одинаковых ключа быть не может и что ключи словаря теперь упорядочены (Python3+). Преобразуем элементы в ключи словаря и обратно в список.
unq = list(dict.fromkeys(array))
____________________
Способы 2-4 НЕ подходят, если элементы списка нехешируемые. То есть они не могут быть в качестве ключа словаря или элемента множества. Например, если у вас список словарей. В этом случае подходит только Способ 1.
#tricks