一、简单字典比较
这里的简单字典比较,指的是没有嵌套字典,仅仅只有一层的意思。
1、比较字典的值
first_dict = { "name": "鸣人", "age": 22, "sex": "男", "title": "六代火影", "heigh": "179cm" } second_dict = { "name": "鸣人", "age": 22, "sex": "女", "title": "六代火影" } keys = set(first_dict) - set(second_dict) print(keys)
结果
{'heigh'}
注意这里是first_dict
键要多余second_dict
时候才会有值,反之没有,如下:
second_dict = { "name": "鸣人", "age": 22, "sex": "男", "title": "六代火影", "heigh": "179cm" } first_dict = { "name": "鸣人", "age": 22, "sex": "女", "title": "六代火影" } keys = set(first_dict) - set(second_dict) print(keys)
结果
set()
2、比较键值
second_dict = { "name": "鸣人", "age": 22, "sex": "男", "title": "六代火影", "heigh": "179cm" } first_dict = { "name": "鸣人", "age": 22, "sex": "女", "title": "六代火影" } value = { k : second_dict[k] for k in set(second_dict) - set(first_dict) } print(value)
结果
{'heigh': '179cm'}
注意这里是first_dict
键要多余second_dict
时候才会有值,反之没有
其他的写法:
second_dict = { "name": "鸣人", "age": 22, "sex": "男", "title": "六代火影" } first_dict = { "name": "鸣人", "age": 22, "sex": "女", "title": "六代火影", "aaaa": 123 } set1 = set(first_dict.items()) set2 = set(second_dict.items()) print(set1 ^ set2)
结果
{('sex', '女'), ('sex', '男'), ('aaaa', 123)}
二、复杂字典比较
这里的复杂字典比较,指的是有嵌套的字典,以嵌套两层的字典为例。
1、利用第三方库比较(dictdiffer)
import dictdiffer second_dict = { "template": "", "template2": "", "data": { "name": "鸣人", "age": 22, "sex": "男", "title": "六代火影" } # 数据 } first_dict = { "template": "11", "template1": "11", "data": { "name": "鸣人", "age": 22, "sex": "女", "title": "六代火影" } # 数据 } for diff in list(dictdiffer.diff(first_dict, second_dict)): print(diff)
结果
('change', 'template', ('11', '')) #值不同 ('change', 'data.sex', ('女', '男')) #嵌套字典值不同 ('add', '', [('template2', '')]) #多的键值对 ('remove', '', [('template1', '11')]) #少的键值对
2、自定义函数
def dict_diff(first, second): """ 比较两个字典的不同 """ KEYNOTFOUNDIN1 = '<KEYNOTFOUNDIN1>' # 没在第一个字典中找到 KEYNOTFOUNDIN2 = '<KEYNOTFOUNDIN2>' # 没在第二个字典中找到 diff = {} sd1 = set(first) sd2 = set(second) # 第二个字典中不存在的键 for key in sd1.difference(sd2): diff[key] = KEYNOTFOUNDIN2 # 第一个字典中不存在的键 for key in sd2.difference(sd1): diff[key] = KEYNOTFOUNDIN1 # 比较不同 for key in sd1.intersection(sd2): if first[key] != second[key]: diff[key] = (first[key], second[key]) return diff if __name__ == '__main__': data1 = { "template": "", "template2": "", "data": { "name": "鸣人", "age": 22, "sex": "男", "title": "六代火影" } # 数据 } data2 = { "template": "11", "template1": "11", "data": { "name": "鸣人", "age": 22, "sex": "女", "title": "六代火影" } # 数据 } print(dict_diff(data1, data2))
结果
{'template2': '<KEYNOTFOUNDIN2>', 'template1': '<KEYNOTFOUNDIN1>', 'template': ('', '11'), 'data': ({'name': '鸣人', 'age': 22, 'sex': '男', 'title': '六代火影'}, {'name': '鸣人', 'age': 22, 'sex': '女', 'title': '六代火影'})}