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