簡體   English   中英

比較和過濾python中的兩個嵌套字典

[英]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}  }

我想在以下條件下將新字典與舊字典進行比較。

  1. new_dict 有不同的鍵(新鍵)
  2. new_dict 舊鍵值已更改
  3. 如果鍵和值相同,則刪除

根據上述條件過濾並創建新字典。

預期輸出:

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}}

我收到關鍵錯誤。 我不知道如何擺脫它

假設您實際上有一個dictdict ,而不是一set dictdict 后者在 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.getold_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM