Python 比較兩個字典


一、簡單字典比較

這里的簡單字典比較,指的是沒有嵌套字典,僅僅只有一層的意思。

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': '六代火影'})}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM