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