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. Для соседних задач пригодятся эти разборы:
- Как удалить элемент из списка Python: remove, pop, del и фильтрация
- Как удалить элемент из списка в Питоне: remove, pop, del и фильтр
- Как выучить Python с нуля: порядок тем и практический план
- Как заменить элемент в списке Python: по индексу, по значению и в цикле