Удаление дубликатов из списка словарей в Python
Быстрый ответ
Для удаления дубликатов в списке словарей следует преобразовать каждый из словарей в множество frozenset
, собрать эти множества в набор set
и затем возвратиться к формату словарей.
Пример кода на Python:
dicts = [{'a': 1, 'b': 2}, {'b' : 2, 'a': 1}, {'a': 2, 'b': 3}]
unique_dicts = [dict(t) for t in {frozenset(d.items()) for d in dicts}]
print(unique_dicts)
Результат: Каждый словарь представлен в результатах только однажды, без учёта порядка ключей.
Методы достижения уникальности
Обсудим подходы к выделению уникальных словарей, которые позволяют сохранять исходные данные при одновременной эффективности обработки.
Использование dict comprehension
Начиная с Python 2.7 и новее, можно использовать генераторы словарей для исключения дубликатов:
unique_dict_list = list({v['id']: v for v in dict_list}.values())
Здесь сохраняется последний встретившийся словарь с конкретным 'id', что является подходящим решением, если каждый словарь в списке имеет уникальный идентификатор.
Преобразование в строки JSON
Сложные словари можно сериализовать в строки JSON для последующего сравнения и хеширования:
import json
unique_json_dicts = {json.dumps(d, sort_keys=True): d for d in dicts}.values()
Использование библиотеки 'numpy'
Для обработки больших объёмов данных подойдёт numpy
, который эффективно работает с массивами данных:
import numpy as np
dicts_array = np.array([tuple(d.items()) for d in dicts])
unique_indices = np.unique(dicts_array, axis=0, return_index=True)[1]
unique_dicts = [dicts[i] for i in unique_indices]
Преобразуя словари в массивы numpy
, мы увеличиваем скорость обработки больших объёмов данных.
Визуализация
Для наглядности воспользуемся аналогией с эмодзи:
🧩 = Уникальный словарь
Исходное состояние:
Имеем группу пазлов, то есть словарей:
🧩🧩🧩🧩🧩🧩
Цель:
Нам нужен набор уникальных элементов:
🧩🧩🧩
Поиск уникальных:
Отбираем только уникальные, выполняя сортировку элементов:
unique_pieces = {tuple(sorted(d.items())) for d in mosaic}
Итог:
В результате мы получаем выборку уникальных пазлов:
🧩1, 🧩2, 🧩3
Вот ваш список уникальных словарей!
Согласованность ключей в словарях
Проверка ключей
Следует удостовериться в стабильности ключей в словарях, чтобы избежать ошибок при удалении дубликатов.
Лексикографическая сортировка
Если словари имеют схожие наборы ключей, надо их сортировать. Это облегчит поиск и удаление дубликатов:
sorted_dicts = sorted(dicts, key=lambda d: tuple(sorted(d.items())))
unique_dicts_sorted = [dict(t) for t in {tuple(d.items()) for d in sorted_dicts}]
Сортировка упрощает сравнение и помогает выявить дублирующиеся записи.
Полезные материалы
- 5. Data Structures — Python 3.12.2 documentation — документация Python о словарях.
- Remove duplicate dict in list in Python – Stack Overflow — методы удаления дублирующихся словарей из списка.
- Dictionaries in Python – Real Python — подробное руководство по словарям в Python.
- python – List of unique dictionaries – Stack Overflow — дискуссия о создании уникальных списков словарей.
- Python – Ways to remove duplicates from list – GeeksforGeeks — способы удаления дубликатов из списка в Python.
- python – Removing duplicates in lists – Stack Overflow — стратегии удаления дубликатов из списков.
- Coding a Todo List in React.js – Part 15 – YouTube — использование множеств для удаления дубликатов, принципы применимы и для Python.