Удаление дубликатов из списка словарей в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

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

Для удаления дубликатов в списке словарей следует преобразовать каждый из словарей в множество frozenset, собрать эти множества в набор set и затем возвратиться к формату словарей.

Пример кода на Python:

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)

Результат: Каждый словарь представлен в результатах только однажды, без учёта порядка ключей.

Кинга Идем в IT: пошаговый план для смены профессии

Методы достижения уникальности

Обсудим подходы к выделению уникальных словарей, которые позволяют сохранять исходные данные при одновременной эффективности обработки.

Использование dict comprehension

Начиная с Python 2.7 и новее, можно использовать генераторы словарей для исключения дубликатов:

Python
Скопировать код
unique_dict_list = list({v['id']: v for v in dict_list}.values())

Здесь сохраняется последний встретившийся словарь с конкретным 'id', что является подходящим решением, если каждый словарь в списке имеет уникальный идентификатор.

Преобразование в строки JSON

Сложные словари можно сериализовать в строки JSON для последующего сравнения и хеширования:

Python
Скопировать код
import json
unique_json_dicts = {json.dumps(d, sort_keys=True): d for d in dicts}.values()

Использование библиотеки 'numpy'

Для обработки больших объёмов данных подойдёт numpy, который эффективно работает с массивами данных:

Python
Скопировать код
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, мы увеличиваем скорость обработки больших объёмов данных.

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

Для наглядности воспользуемся аналогией с эмодзи:

Markdown
Скопировать код
🧩 = Уникальный словарь

Исходное состояние:

Имеем группу пазлов, то есть словарей:

Markdown
Скопировать код
🧩🧩🧩🧩🧩🧩

Цель:

Нам нужен набор уникальных элементов:

Markdown
Скопировать код
🧩🧩🧩

Поиск уникальных:

Отбираем только уникальные, выполняя сортировку элементов:

Python
Скопировать код
unique_pieces = {tuple(sorted(d.items())) for d in mosaic}

Итог:

В результате мы получаем выборку уникальных пазлов:

Markdown
Скопировать код
🧩1, 🧩2, 🧩3

Вот ваш список уникальных словарей!

Согласованность ключей в словарях

Проверка ключей

Следует удостовериться в стабильности ключей в словарях, чтобы избежать ошибок при удалении дубликатов.

Лексикографическая сортировка

Если словари имеют схожие наборы ключей, надо их сортировать. Это облегчит поиск и удаление дубликатов:

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

Сортировка упрощает сравнение и помогает выявить дублирующиеся записи.

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

  1. 5. Data Structures — Python 3.12.2 documentation — документация Python о словарях.
  2. Remove duplicate dict in list in Python – Stack Overflow — методы удаления дублирующихся словарей из списка.
  3. Dictionaries in Python – Real Python — подробное руководство по словарям в Python.
  4. python – List of unique dictionaries – Stack Overflow — дискуссия о создании уникальных списков словарей.
  5. Python – Ways to remove duplicates from list – GeeksforGeeks — способы удаления дубликатов из списка в Python.
  6. python – Removing duplicates in lists – Stack Overflow — стратегии удаления дубликатов из списков.
  7. Coding a Todo List in React.js – Part 15 – YouTube — использование множеств для удаления дубликатов, принципы применимы и для Python.