logo

Удаление дубликатов из списка в Python: уникальные элементы

Быстрый ответ

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

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.

Если элементы нехешируемые

Если в вашем списке присутствуют нехешируемые элементы, такие как вложенные списки или словари, то можно воспользоваться подходом с вложенным циклом:

Python
Скопировать код
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 у нас появляется возможность сохранять порядок ключей в словарях:

Python
Скопировать код
original = [4, 5, 6, 4, 5]  # Как видим, кто-то заметно предпочитает монотонность
deduped = list(dict.fromkeys(original))

В результате deduped будет [4, 5, 6] — порядок элементов сохранён. Не волшебство, а всего лишь штрихи Python.

Создаем многоразовые функции

Соблюдайте принцип DRY — «Don't Repeat Yourself» или «Не повторяйте себя». Вот так можно разработать универсальную функцию для удаления дубликатов из любого списка:

Python
Скопировать код
def remove_duplicates(lst):
    return list(dict.fromkeys(lst))

unique_list = remove_duplicates(original)

Использовать такую функцию полезно в различных частях кода, это повышает его читаемость и облегчает поддержку.

Визуализация

Представьте каждый элемент как уникальный ключ на связке:

Markdown
Скопировать код
До: [🔑, 🔑, 🍀, 🍀, 🍀, 🌟, 🔑, 🌟]
# Слишком много одинаковых ключей для одной связки.

Применить функцию очистки от дубликатов:

Python
Скопировать код
unique_items = list(set(your_list))

Полученный результат:

Markdown
Скопировать код
После: [🔑, 🍀, 🌟]
# Теперь наша связка ключей выглядит аккуратно, как после процедуры всё-таки отбора!

Примечание: Порядок элементов мог измениться, так как множества не сохраняют последовательности элементов.

За пределами простых списков: Сложные случаи

Усложняя случаи, когда в списке есть уникальные объекты, или для удаления дублей нужно принимать во внимание определённые атрибуты объектов, Python предлагает решение с проявлением гибкости.

В этом сложном случае у нас есть возможность воспользоваться groupby из модуля itertools и работать с отсортированными списками:

Python
Скопировать код
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'].

Полезные материалы

    1. Data Structures — Python 3.12.1 documentation
    — практика выполнения операций с множествами для удаления дубликатов.
  1. python – Removing duplicates in lists – Stack Overflow — обсуждения сообщества о методах удаления дублей.
  2. Sets in Python – Real Python — подробное описание работы с множествами в Python.
    1. Data Structures — Python 3.12.1 documentation
    — совершенствование операций со списками.
  3. Python Remove Duplicates from a List – GeeksforGeeks — обзор методов для удаления дубликатов из списка.
  4. How to remove duplicates from a Python List – W3Schools — основы удаления дубликатов из списка.
  5. Sets in Python || Python Tutorial || Learn Python Programming – YouTube — видеокурс о применении множеств в Python.