Python3 Определить, равны ли два словаря [дубликаты]

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

Я хочу:

a = {'foo': 1, 'bar': 2}
b = {'foo': 1, 'bar': 2}
c = {'bar': 2, 'foo': 1}
d = {'foo': 2, 'bar': 1}
e = {'foo': 1, 'bar': 2, 'baz':3}
f = {'foo': 1}

equal(a, b)   # True 
equal(a, c)   # True  - order does not matter
equal(a, d)   # False - values do not match
equal(a, e)   # False - e has additional elements
equal(a, f)   # False - a has additional elements

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


person Marc Wagner    schedule 17.11.2018    source источник


Ответы (2)


== работает

a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
a == b == c == d == e
True

Я надеюсь, что приведенный выше пример поможет вам.

person Sharvin26    schedule 17.11.2018
comment
не работает для вложенных словарей - person Neil; 11.04.2021
comment
отлично работает для вложенных словарей, я тестировал с python3.8. - person bappak; 24.06.2021

Старый добрый оператор == работает.

person Constantine32    schedule 17.11.2018
comment
== работает. Однако для больших словарей я бы сначала сделал тривиальную проверку, то есть сравнил количество ключей. Ведь нет необходимости углубляться в сравнение значений, если в одном словаре 2 ключа, а в другом 10. - person rbaleksandar; 17.11.2018
comment
Это хороший способ мышления, но это не обязательно. == между двумя словарями очень хорошо оптимизирован и учитывает такие факторы, как тот, который вы упомянули. - person Constantine32; 17.11.2018
comment
Чтобы продолжить ответ @Constantine32, вот реализация Cython dict ==, которая делает именно то, что он говорит. hg.python.org/cpython/file/6f535c725b27/Objects/ - person Scott Driggers; 22.06.2021