2015-02-07 4 views
0

Как я могу сложить словари, содержащие словари?сравнить два словаря в python

Это будет работать в том случае, словари содержат простые значения

# will show the keys with different values 

d1_keys = set(dict1.keys()) 
d2_keys = set(dict2.keys()) 
intersect_keys = d1_keys.intersection(d2_keys) 
modified = {} 
for i in intersect_keys: 
    if dict1[i] != dict2[i] : modified.update({i : (dict1[i], dict2[i])}) 

, но у меня есть словарь, как это:

{ 'medic1' : {'date' : '02/02/2015', 'no' : '123' }, 'medic2' : {'date' :'02/03/2015', 'no' : '456' }} 
+4

Что вы имеете в виду "сравнить"? Из вашего примера, похоже, вы пытаетесь каким-то образом создать новый словарь, который их объединяет, но вы используете неопределенную переменную 'o'. Пожалуйста, объясните, какой результат вы хотите. – BrenBarn

+0

моя ошибка для неопределенной переменной. результат, который я хочу, - это распечатать (я выбрал для него dict) ключи, которые были модифицированы в dict. –

ответ

3

Функция рекурсии для вложенного словаря.

  1. Получить общие ключи от оба словаря keys() и set operation.
  2. общих ключей итерации по for циклу.
  3. Проверить, есть ли значение dict или нет.
  4. Если тип значения равен dict, тогда вызовите эту же функцию и введите словарь значений в качестве аргументов. и добавить результат как ключ в словарь modified.
  5. Если тип значения не является dict, то добавьте в словарь modified.

код:

dict1 = { 
     'medic1' : {'date' : '02/02/2015', 'no' : '123' }, 
     'medic2' : {'date' : '02/03/2015', 'no' : '456' }, 
     'testkey1': 'testvalue1', 
     'testkey2': 'testvalue2', 
     'testkey3':{ "level2_1":"value2_1", 
      "level2_2":{ 
         "level3_1": "value3_1_change", 
         "level3_2": "value3_2", 
        } 
     } 
} 

dict2 = { 
     'medic1' : {'date' : '02/02/2015', 'no' : '456' }, 
     'medic2' : {'date' : '02/03/2015', 'no' : '456' }, 
     'testkey1': 'testvalue1', 
     'testkey2': 'testvalue22', 
     'testkey3':{ "level2_1":"value2_1", 
        "level2_2":{ 
           "level3_1": "value3_1", 
           "level3_2": "value3_2", 
          } 
       } 

} 

import copy 

def compareDict(dict1, dict2): 

    d1_keys = dict1.keys() 
    d2_keys = dict2.keys() 
    intersect_keys = set(d1_keys).intersection(set(d2_keys)) 
    modified = {} 
    for i in intersect_keys: 
     if dict1[i] != dict2[i] : 
      if isinstance(dict1[i], dict) and isinstance(dict1[i], dict): 
       modified[i]=compareDict(dict1[i], dict2[i]) 
      else: 
       modified.update({i : (dict1[i], dict2[i])}) 

    return copy.deepcopy(modified) 


modified = compareDict(dict1, dict2) 
import pprint 
pprint.pprint(modified) 

выход:

[email protected]:~/Desktop/stackoverflow$ python 5.py 
{'medic1': {'no': ('123', '456')}, 
'testkey2': ('testvalue2', 'testvalue22'), 
'testkey3': {'level2_2': {'level3_1': ('value3_1_change', 'value3_1')}}} 
0

Пока ключи являются hashable (которых dict гарантии ! -) не имеет значения, имеют ли значения - код:

common_keys = set(dict1).intersection(dict2) 

(упрощенная версия первых трех линий), то

modified = {k: (dict1[k], dict2[k]) 
      for k in common_keys if dict1[k] != dict2[k]} 

(упрощенная версия ваших последних трех строк) будет работать нормально!

Смежные вопросы