繁体   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