[英]compare and filter the two nested dictionaries in python
我在下面列出了兩個字典
old_dict = { {'laptop' : {'purchasedon': 10052022} , {'mobile' : {'purchasedon': 10052022} }
new_dict = { {'laptop' : {'purchasedon': 10062022} , {'mobile' : {'purchasedon': 10052022} , {'tab' : {'purchasedon': 10062022} }
我想在以下條件下將新字典與舊字典進行比較。
根據上述條件過濾並創建新字典。
預期輸出:
final_dict = { {'laptop' : {'purchasedon': 10062022} , {'tab' : {'purchasedon': 10062022} }
我的代碼
final_dict = {}
for k1, v1 in new_dict.items(): # the basic way
if new_dict[k1]['purchaseon'] != old_dict[k1]['purchaseon']:
final_dict = {k1: {'purchaseon': v1}}
我收到關鍵錯誤。 我不知道如何擺脫它
假設您實際上有一個dict
的dict
,而不是一set
dict
的dict
。 后者在 Python 中是不可能的,而前者也更符合您現有的代碼。
>>> old_dict = {'laptop': {'purchasedon': 10052022}, 'mobile': {'purchasedon': 10052022}}
>>> new_dict = {'laptop': {'purchasedon': 10062022}, 'mobile': {'purchasedon': 10052022}, 'tab': {'purchasedon': 10062022}}
要修復 KeyError,您必須先檢查密鑰是否在old_dict
中,然后再嘗試訪問它。 另請注意,在if
中使用final_dict = ...
會覆蓋整個字典。 您可能希望final_dict[k1] = v1
僅插入該元素( v1
已經是整個內部字典)。
final_dict = {}
for k, v in new_dict.items():
if k not in old_dict or old_dict[k]['purchasedon'] != v['purchasedon']:
final_dict[k] = v
您也可以在 dict 理解中這樣做:
>>> {k: v for k, v in new_dict.items() if k not in old_dict or old_dict[k]['purchasedon'] != v['purchasedon']}
{'laptop': {'purchasedon': 10062022}, 'tab': {'purchasedon': 10062022}}
如果您實際上不想僅通過purchasedon
進行比較,您也可以使用此變體:
>>> {k: v for k, v in new_dict.items() if k not in old_dict or old_dict[k] != v}
{'laptop': {'purchasedon': 10062022}, 'tab': {'purchasedon': 10062022}}
假設new_dict
不包含None
值,您也可以使用dict.get
從old_dict
獲取值(如果存在),或者None
(不是例外)如果不存在。
>>> {k: v for k, v in new_dict.items() if old_dict.get(k) != v}
{'laptop': {'purchasedon': 10062022}, 'tab': {'purchasedon': 10062022}}
我假設您在問題中所做的 dict 表示無效,並且可能看起來像
old_dict = {'laptop': {'purchasedon': 10052022}, 'mobile': {'purchasedon': 10052022}}
new_dict = {'laptop': {'purchasedon': 10062022}, 'mobile': {'purchasedon': 10052022},
'tab': {'purchasedon': 10062022}}
您可以比較 dicts 是否相等,因此可以采用如下簡單的方法
# Find new keys!
new_keys = set(new_dict.keys()) - set(old_dict.keys())
# For a dict, with all new keys
final_dict = {new_key: new_dict.get(new_key) for new_key in new_keys}
# Find all records, which are not equal in both set of keys
modified_records = {ex_key: new_dict.get(ex_key) for ex_key in old_dict if
new_dict.get(ex_key) != old_dict.get(ex_key)}
# Create the final dict
final_dict.update(modified_records)
這可以為您提供類似於您需要的輸出
{"tab": {"purchasedon": 10062022}, "laptop": {"purchasedon": 10062022}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.