Сравнение двух словарей python

у меня есть два словаря, но для упрощения я возьму эти два:

теперь я хочу сравнить, каждый ли key, value в паре x имеет такое же соответствующее значение в y . Вот что я написал:–8–>

и он работает с tuple возвращается, а затем сравнивается для равенства.

это правильно? Есть ли лучше как это сделать? Лучше не в скорости, я говорю о коде изящество.

обновление: я забыл упомянуть, что я должен проверить, сколько key, value пар равны.

17 ответов

Если вы хотите знать, сколько значений совпадают в обоих словарях, вы должны были сказать, что:)

может, что-то вроде этого:

что вы хотите сделать, это просто x==y

то, что вы делаете, не является хорошей идеей, потому что элементы в словаре не должны иметь никакого порядка. Возможно, вы сравниваете [(‘a’,1),(‘b’,1)] С [(‘b’,1), (‘a’,1)] (те же словари, разного порядка).

например, вижу так:

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

Я новичок в python, но в итоге я сделал что-то похожее на @mouad

оператор XOR ( ^ ) следует исключить все элементы Дикта, когда они одинаковы в обоих диктах.

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

чтобы проиллюстрировать, следующие примеры возвращают словарь, равный <"one": 1, "two": 2, "three": 3>:

@mouad хорош, если вы предполагаете, что оба словаря просто содержат простые значения. Однако если у вас есть словари, содержащие словари, вы получите исключение, поскольку словари не хэшируются.

С моей головы, что-то вроде этого может сработать:

еще одна возможность, до последней ноты OP, – сравнить хэши ( SHA или MD ) из dicts сбрасывается как JSON. Способ построения хэшей гарантирует, что если они равны, исходные строки также равны. Это очень быстро и математически обоснованно.

так как кажется, никто не упомянул deepdiff , Я добавлю его здесь только для полноты. Я нахожу это очень удобным для получения различий (вложенных) объектов в целом.

deepdiff пакет должен быть установлен, как это не стандартный пакет

некоторые усилия придется приложить для разбора результат

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

чтобы проверить, равны ли два Дикта в ключах и значениях:

Читайте также:  Узо для стиральной машины сколько ампер

Если вы хотите вернуть значения, которые отличаются, напишите по-другому:

вам придется назвать это дважды i.e

функция отлично ИМО, ясно и интуитивно. Но чтобы дать вам (другой) ответ, вот мой ход:

может быть полезно для вас или для кого-либо еще..

вот еще вариант:

Так как вы видите, что два идентификатора разные. Но . –6–>богатые операторы сравнения кажется, сделать трюк:

В PyUnit есть метод, который сравнивает словари красиво. Я протестировал его, используя следующие два словаря, и он делает именно то, что вы ищете.

Я не рекомендую импорта unittest на ваш рабочий код. Моя мысль-источник в PyUnit может быть переработан для запуска в производство. Он использует pprint который "довольно печатает" словари. Кажется, довольно легко адаптировать этот код, чтобы быть "готов".

в Python 3.6, это можно сделать так:-

переменная ret будет истинной, если все элементы dict_1 присутствуют в dict_2

таким образом, вы можете вычесть dictView2 из dictView1, и он вернет набор пар ключ / значение, которые отличаются в dictView2:

вы можете пересекать, объединять, разность (показано выше), симметричную разность этих объектов представления словаря.
Лучше? Быстрее? – не уверен, но часть стандартной библиотеки, что делает ее большой плюс переносимость

Всем привет, есть два массива данных собраных из разных linux систем и базы данных 1. data_db 2. data_linux

нужно найти совпадения, и выполнить простое арефметическое действие, то есть если key из data_db и key из data_linux совпадают то key,value(data_db) – key,value(data_linux) = result

пробовал искать совпадения таким образом

но не могу понять как быть с арифметикой пробовал делать таким способом:

но тут сбился с толку так как типы данных не int и тд, и выглядит довольно глупо и не логично. Value всегда цифры, если туда попадает не цифра то я записываю 0 Кто может подсказать идею как решить такую задачу? спасибо.

179 user225312 [2010-12-24 22:09:00]

У меня есть два словаря, но для упрощения я возьму эти два:

Теперь я хочу сравнить, имеет ли каждая пара key, value в x одно и то же соответствующее значение в y . Поэтому я написал следующее:

Читайте также:  Видеодомофоны для квартиры как выбрать

И он работает, поскольку возвращается tuple , а затем сравнивается для равенства.

Это правильно? Есть лучший способ сделать это? Лучше не в скорости, я говорю об элегантности кода.

ОБНОВЛЕНИЕ: Я забыл упомянуть, что мне нужно проверить, сколько пар key, value равно.

python comparison dictionary

21 ответ

128 Решение mouad [2010-12-24 22:17:00]

Если вы хотите узнать, сколько значений соответствует в обоих словарях, вы должны были сказать это 🙂

Может быть, что-то вроде этого:

Что вы хотите сделать, просто x==y

Что вы делаете, это не очень хорошая идея, потому что элементы в словаре не должны иметь никакого порядка. Вы могли бы сравнить [(‘a’,1),(‘b’,1)] с [(‘b’,1), (‘a’,1)] (те же словари, разные порядки).

Например, см. это:

Разница заключается только в одном элементе, но ваш алгоритм увидит, что все элементы разные.

Для иллюстрации все следующие примеры возвращают словарь, равный <"one": 1, "two": 2, "three": 3>:

Действительно для py2 и py3 .

50 philipp [2013-06-13 22:04:00]

Я новичок в python, но в итоге я сделал что-то похожее на @mouad

Оператор XOR ( ^ ) должен исключать все элементы dict, если они одинаковы в обоих dicts.

41 Shiyu [2015-04-29 03:51:00]

13 Anubis [2018-06-18 17:54:00]

Поскольку, похоже, никто не упоминает deepdiff , я добавлю его здесь только для полноты. Мне очень удобно получать diff (вложенные) объекты в целом.

deepdiff пакет deepdiff поскольку это не стандартный пакет

необходимо приложить некоторые усилия для разбора результата

Однако, для того, чтобы использовать различные словари, я считаю, что dictdiffer очень удобен.

@mouad ответ хорош, если вы предполагаете, что оба словаря просто содержат простые значения. Однако, если у вас есть словари, содержащие словари, вы получите исключение, поскольку словари не хешируются.

С головы до головы может получиться что-то вроде этого:

5 WoJ [2015-03-15 11:11:00]

Еще одна возможность, вплоть до последней ноты OP, заключается в сравнении хешей ( SHA или MD ) dicts, сбрасываемых как JSON. Способ построения хэшей гарантирует, что, если они равны, исходные строки также равны. Это очень быстро и математически звучит.

Чтобы проверить, равны ли два диктатора в ключах и значениях:

Если вы хотите вернуть значения, которые отличаются, напишите их по-разному:

Читайте также:  Приложение чтобы качать видео с ютуба

Вы должны были бы назвать это дважды, т.е.

2 Yas [2017-02-05 00:12:00]

Ниже код поможет вам сравнить список dict в python

1 zwep [2018-05-02 12:30:00]

Функция отличная ИМО, понятная и интуитивно понятная. Но чтобы дать вам (другой) ответ, вот мой ход:

Может быть полезно для вас или для кого-либо еще.

Вот еще один вариант:

Итак, как вы видите, два идентификатора отличаются друг от друга. Но богатые операторы сравнения, похоже, делают трюк:

Опоздание в моем ответе лучше, чем никогда!

Сравнение Not_Equal более эффективно, чем сравнение Equal. Как таковые, два диктата не равны, если какие-либо ключевые значения в одном диктате не найдены в другом. Приведенный ниже код учитывает, что вы, возможно, сравниваете dict по умолчанию и, следовательно, используете get вместо getitem [].

Использование своего рода случайного значения в качестве значения по умолчанию в вызове get, равного извлекаемому ключу – на тот случай, если для dicts значение None установлено в одном dict, а этот ключ не существует в другом. Кроме того, условие get! = Проверяется перед условием не в состоянии для эффективности, потому что вы выполняете проверку ключей и значений с обеих сторон одновременно.

0 MikeyE [2017-04-10 05:53:00]

В PyUnit есть метод, который красиво сравнивает словари. Я тестировал его, используя следующие два словаря, и он делает именно то, что вы ищете.

Я не рекомендую импортировать unittest в ваш производственный код. Моя мысль о том, что источник в PyUnit может быть переделан для запуска в производство. Он использует pprint , который "красиво печатает" словари. Кажется довольно легко адаптировать этот код к "готовому производству".

Таким образом вы можете вычесть dictView2 из dictView1, и он вернет набор пар ключ/значение, которые отличаются в dictView2:

Вы можете пересечь, объединить, разницу (показано выше), симметричную разницу этих объектов просмотра словаря.
Лучше? Быстрее? – не уверен, но является частью стандартной библиотеки, что делает его большим плюсом для переносимости