Сравнение двух словарей в Python - PullRequest
205 голосов
/ 24 декабря 2010

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

>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)

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

>>> for x_values, y_values in zip(x.iteritems(), y.iteritems()):
        if x_values == y_values:
            print 'Ok', x_values, y_values
        else:
            print 'Not', x_values, y_values

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

Мои вопросы:

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

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

Ответы [ 22 ]

0 голосов
/ 28 ноября 2018

Вот мой ответ, используйте рекурсивный способ:

def dict_equals(da, db):
    if not isinstance(da, dict) or not isinstance(db, dict):
        return False
    if len(da) != len(db):
        return False
    for da_key in da:
        if da_key not in db:
            return False
        if not isinstance(db[da_key], type(da[da_key])):
            return False
        if isinstance(da[da_key], dict):
            res = dict_equals(da[da_key], db[da_key])
            if res is False:
                return False
        elif da[da_key] != db[da_key]:
            return False
    return True

a = {1:{2:3, 'name': 'cc', "dd": {3:4, 21:"nm"}}}
b = {1:{2:3, 'name': 'cc', "dd": {3:4, 21:"nm"}}}
print dict_equals(a, b)

Надеюсь, это поможет!

0 голосов
/ 04 июля 2017

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

if (len(dict_1)==len(dict_2): 
  for i in dict_1.items():
        ret=bool(i in dict_2.items())

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...