Удаление дубликатов из списка в Python: уникальные элементы
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для удаления дубликатов из списка, с сохранением первоначального порядка элементов, можно использовать следующий подход с применением механизма множества:
original = [1, 2, 2, 3, 2, 1] # Очевидно, копирование связано со сбоем
deduped = [x for x in original if not (x in seen := set()) and not seen.add(x)]
Итак, мы получили deduped
: [1, 2, 3] — список без повторяющихся элементов, где сохраняется порядок элементов из original
.
Если элементы нехешируемые
Если в вашем списке присутствуют нехешируемые элементы, такие как вложенные списки или словари, то можно воспользоваться подходом с вложенным циклом:
def remove_duplicates(nested_list):
unique_list = [] # Пустой список
for element in nested_list:
if element not in unique_list: # Проверяем каждый элемент
unique_list.append(element) # Добавляем, если элемент уникален
return unique_list
Применив функцию remove_duplicates(your_nested_list)
, вы получите список, из которого удалены дублирующиеся элементы.
Сохранение порядка и производительность
С Python 3.8 у нас появляется возможность сохранять порядок ключей в словарях:
original = [4, 5, 6, 4, 5] # Как видим, кто-то заметно предпочитает монотонность
deduped = list(dict.fromkeys(original))
В результате deduped
будет [4, 5, 6] — порядок элементов сохранён. Не волшебство, а всего лишь штрихи Python.
Создаем многоразовые функции
Соблюдайте принцип DRY — «Don't Repeat Yourself» или «Не повторяйте себя». Вот так можно разработать универсальную функцию для удаления дубликатов из любого списка:
def remove_duplicates(lst):
return list(dict.fromkeys(lst))
unique_list = remove_duplicates(original)
Использовать такую функцию полезно в различных частях кода, это повышает его читаемость и облегчает поддержку.
Визуализация
Представьте каждый элемент как уникальный ключ на связке:
До: [🔑, 🔑, 🍀, 🍀, 🍀, 🌟, 🔑, 🌟]
# Слишком много одинаковых ключей для одной связки.
Применить функцию очистки от дубликатов:
unique_items = list(set(your_list))
Полученный результат:
После: [🔑, 🍀, 🌟]
# Теперь наша связка ключей выглядит аккуратно, как после процедуры всё-таки отбора!
Примечание: Порядок элементов мог измениться, так как множества не сохраняют последовательности элементов.
За пределами простых списков: Сложные случаи
Усложняя случаи, когда в списке есть уникальные объекты, или для удаления дублей нужно принимать во внимание определённые атрибуты объектов, Python предлагает решение с проявлением гибкости.
В этом сложном случае у нас есть возможность воспользоваться groupby
из модуля itertools
и работать с отсортированными списками:
from itertools import groupby
original = [('apple', 1), ('banana', 2), ('apple', 3)] # Немного радости жизни
sorted_original = sorted(original, key=lambda x: x[0]) # Сортируем по названию фруктов
deduped = [key for key, group in groupby(sorted_original, key=lambda x: x[0])]
И, наконец, мы получаем deduped
со списком ['apple', 'banana'].
Полезные материалы
- 5. Data Structures — Python 3.12.1 documentation — практика выполнения операций с множествами для удаления дубликатов.
- python – Removing duplicates in lists – Stack Overflow — обсуждения сообщества о методах удаления дублей.
- Sets in Python – Real Python — подробное описание работы с множествами в Python.
- 5. Data Structures — Python 3.12.1 documentation — совершенствование операций со списками.
- Python Remove Duplicates from a List – GeeksforGeeks — обзор методов для удаления дубликатов из списка.
- How to remove duplicates from a Python List – W3Schools — основы удаления дубликатов из списка.
- Sets in Python || Python Tutorial || Learn Python Programming – YouTube — видеокурс о применении множеств в Python.