Python

Как удалить повторяющиеся элементы из списка Python: set, dict.fromkeys и порядок

В Python повторяющиеся элементы из списка можно убрать несколькими способами. Самый короткий вариант — превратить список в set, но он не гарантирует исходный порядок. Если порядок важен, лучше использовать dict.fromkeys() или обычный цикл

Выбор способа зависит от задачи. Для «получить набор уникальных значений» подойдет set. Для «оставить первое появление каждого элемента и сохранить порядок» лучше dict.fromkeys()

Короткий ответ

Если порядок не важен

items = ["python", "sql", "python", "java", "sql"]
unique_items = list(set(items))

print(unique_items)

Результат может быть в другом порядке

['java', 'python', 'sql']

Если порядок важен

items = ["python", "sql", "python", "java", "sql"]
unique_items = list(dict.fromkeys(items))

print(unique_items)

Результат

['python', 'sql', 'java']

Почему set меняет порядок

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

numbers = [3, 1, 3, 2, 1]
print(list(set(numbers)))

Вы можете получить не тот порядок, в котором числа встретились впервые. Для проверки уникальности это нормально, для аккуратного списка — не всегда

Как сохранить порядок через dict.fromkeys

Словари в современных версиях Python сохраняют порядок добавления ключей. Поэтому dict.fromkeys(items) берет элементы списка как ключи, а повторяющиеся ключи не добавляет второй раз

numbers = [3, 1, 3, 2, 1]
unique_numbers = list(dict.fromkeys(numbers))

print(unique_numbers)

Результат

[3, 1, 2]

Это часто самый удобный способ убрать дубли без потери порядка

Как убрать дубли через цикл

Цикл полезен, когда нужно не просто удалить повторы, а добавить условие или обработать элементы перед сравнением

items = ["Python", "python", "SQL", "sql", "Python"]
unique_items = []
seen = set()

for item in items:
    key = item.lower()

    if key not in seen:
        unique_items.append(item)
        seen.add(key)

print(unique_items)

Результат

['Python', 'SQL']

Здесь Python и python считаются одинаковыми, потому что мы сравниваем их через item.lower(), но в результат кладем первое исходное написание

Как удалить дубли из списка чисел

Для чисел все то же самое

numbers = [10, 20, 10, 30, 20, 40]
unique_numbers = list(dict.fromkeys(numbers))

print(unique_numbers)

Результат

[10, 20, 30, 40]

Если нужно еще и отсортировать результат, можно использовать sorted(set(numbers))

numbers = [10, 20, 10, 30, 20, 40]
unique_sorted = sorted(set(numbers))

print(unique_sorted)

Результат

[10, 20, 30, 40]

Как удалить дубли из списка словарей

Со словарями сложнее, потому что обычный set не умеет хранить изменяемые объекты вроде dict. Нужно выбрать признак, по которому вы считаете элементы одинаковыми

users = [
    {"id": 1, "name": "Аня"},
    {"id": 2, "name": "Игорь"},
    {"id": 1, "name": "Аня"},
]

unique_users = []
seen_ids = set()

for user in users:
    if user["id"] not in seen_ids:
        unique_users.append(user)
        seen_ids.add(user["id"])

print(unique_users)

Результат

[{'id': 1, 'name': 'Аня'}, {'id': 2, 'name': 'Игорь'}]

Здесь пользователи считаются одинаковыми по id. В реальной задаче признаком может быть email, артикул товара, ссылка или другой уникальный ключ

Как посчитать, какие элементы повторялись

Иногда нужно не удалить дубли, а понять, что повторилось. Для этого удобен Counter

from collections import Counter

items = ["python", "sql", "python", "java", "sql", "python"]
counts = Counter(items)

for item, count in counts.items():
    if count > 1:
        print(item, count)

Результат

python 3
sql 2

Counter полезен, когда нужно не только получить уникальные элементы, но и увидеть частоту

Мини-практика

Создайте файл unique_list.py

emails = [
    "anna@example.com",
    "ivan@example.com",
    "anna@example.com",
    "dina@example.com",
    "ivan@example.com",
]

unique_emails = list(dict.fromkeys(emails))

print("Было:", emails)
print("Стало:", unique_emails)

Запустите файл и убедитесь, что порядок первых появлений сохранился. Потом попробуйте заменить dict.fromkeys(emails) на set(emails) и сравнить вывод

Частые ошибки

Первая ошибка — использовать list(set(items)), когда порядок важен. Код короткий, но результат может выглядеть неожиданно

Вторая ошибка — пытаться положить словари в set. Словарь изменяемый, поэтому Python не может сделать его элементом множества

Третья ошибка — удалять элементы из списка прямо во время обхода того же списка. Такой код легко пропускает элементы и ведет себя непредсказуемо. Лучше создавать новый список

Что почитать дальше по Python

Если нужен общий маршрут по теме, откройте рубрику Python. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x