一、簡單字典比較
這里的簡單字典比較,指的是沒有嵌套字典,僅僅只有一層的意思。
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': '六代火影'})}
