比较 python 中的两个词典

compare two dictionaries in 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' }}

只要 keys 是可散列的(dict 保证!-)values[=21] 是否无关紧要=] 是否——代码如下:

common_keys = set(dict1).intersection(dict2)

(前三行的简化版本),然后

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

(最后三行的简化版本)可以正常工作!

通过嵌套字典的递归函数。

  1. 通过keys()set operation.
  2. 从两个字典中获取公共键
  3. 通过 for 循环迭代常用键。
  4. 检查键的值 type 是否为 dict
  5. 如果值类型是 dict 则调用相同的函数并将值字典作为参数传递。并将结果作为键添加到 modified 字典中。
  6. 如果值类型不是字典,则添加到 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)

输出:

vivek@vivek:~/Desktop/Whosebug$ python 5.py 
{'medic1': {'no': ('123', '456')},
 'testkey2': ('testvalue2', 'testvalue22'),
 'testkey3': {'level2_2': {'level3_1': ('value3_1_change', 'value3_1')}}}