Как вывести отличающиеся (ключ, значение) одного словаря от другого словаря?

Здравствуйте. У меня имеется два больших по размеру словаря. Ключи у обоих словарей одинаковые, но у одинаковых ключей могут отличаться значения. Задача заключается в поиске отличающиеся пары (ключ, значение) из второго словаря. Существует ли быстрый способ найти эту пару?
  • Вопрос задан
  • 693 просмотра
Решения вопроса 1
есть вот такое, можете попробовать dictdiffer
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Вы как-то не очень четко поставили задачу.
  1. Нужно прояснить следующие важные детали:
  2. У различной пары может отличаться как ключ, так и значение по отдельности?
  3. Наборы ключей одинаковые? Неодинаковые? Могут отличаться?
  4. Значения хешируемые?
  5. Количество пар совпадает, или одна пара в одном из словарей может отсутствовать?
  6. Одна и только одна пара?
  7. Какая версия Питона? Если третья, то словари одинаково упорядочены по ключу? Может быть они еще и отсортированы? Ну мало ли...
  8. Насколько большие словари? Их размер сопоставим с полным объёмом памяти?
  9. Ваша задача выглядит так, будто имеет смысл решать её немного в другом месте и в другое время (в смысле формирования структуру данных и заполнения их). Поясните почему такая задача возникла, возможно есть другой, более элегантный и эффективный подход, нежели сравнивать большие словари.


Похоже вот это будет для вас приемлемым решением:
import typing

def ddif(a: dict, b: dict) -> typing.Iterable[tuple]:
    return filter(None, (None if va == b[k] else (k, va, b[k]) for k, va in a.items()))

a = {1: 11, 2: 22, 3: [1, 2, 3], 4: 44, 5: 55}
b = {1: 11, 2: 22, 3: [1, 2, 4], 4: 44, 5: 56}
for k, v1, v2 in ddif(a, b):
    print(f'{k}: {v1!r} != {v2!r}')

Там возвращается итератор, поэтому, если вы уверены, что различие только одно, то можете воcпользоваться islice, чтобы остановиться на первом различии:
from itertools import islice
print(
    list(islice(ddif(a, b), None, 1))
)
Ответ написан
@galaxy
Существует ли быстрый способ найти эту пару?

Быстрый для компьютера или для программиста?

Так-то, если в одну строчку:
a = {'1': 1, '3': 3, '2': 2, '5': 5, '4': 4, '7': 0, '6': 6, '9': 9, '8': 8}
b = {'3': 3, '2': 2, '5': 5, '4': 16, '7': 7, '6': 6, '9': 9, '8': 8}

set(a.items()) ^ set(b.items())
# set([('4', 4), ('1', 1), ('7', 7), ('4', 16), ('7', 0)])

set(a.items()) - set(b.items())
# set([('1', 1), ('4', 4), ('7', 0)])

set(b.items()) - set(a.items())
# set([('7', 7), ('4', 16)])
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы