根据键更新嵌套字典中的值

时间:2021-06-21 07:52:33

标签: python dictionary nested

我有一个嵌套字典,我想根据其键值更新项目的值。 例如,我有以下字典,我想将 key=='p' 项的每次出现的值设置为 1。

my_dict = {'p': 0, 'nested_dict': {'p': 0, 'a': 2}}

对于常规字典(非嵌套),update 方法提供了一个简单的单行解决方案:

my_dict.update((x, 1) for x, y in my_dict.items() if x=='p')

我正在为嵌套字典的情况寻找类似的解决方案

2 个答案:

答案 0 :(得分:2)

如果字典的最大深度是已知的并且是常数,并且 'p' 总是出现在相同的深度,这可以不用递归解决。在所有其他情况下,都需要递归方法。根据示例问题和您的评论,我将假设第二个是正确的。这是一个递归解决方案:

def setPto1(dct):
    return {k: setPto1(v) if isinstance(v, dict) else [v, 1][k=='p'] for k, v in dct.items()}

所以你基本上用递归字典理解遍历键值对。你的方法离你不远了。如果有不明白的地方,请留言。

如果[v, 1][k=='p']让您感到不安,您可以将其替换为更直接的(1 if k=='p' else v)。它们是同一回事。

答案 1 :(得分:0)

也许这可以帮助您入门(您仍然可以使其更通用,并且重复键可能会出现问题):

from functools import reduce

def decision_func(d, item, replace_on_item, replace_val):
    if item == replace_on_item:
        d[item] = replace_val
    else:
        return d[item]

my_dict = {'p': 0, 'nested_dict': {'p': 0, 'a': 2}}
reduce(lambda d, item: decision_func(d, item, 'p', ["some_other_val", 2]), ['nested_dict', 'p'], my_dict)
print(my_dict)

输出:

{'p': 0, 'nested_dict': {'p': ['some_other_val', 2], 'a': 2}}

这里所做的是您将使用 reduce 函数向下运行嵌套树,而 decision_func 是决定是否更新给定条目或返回的函数该键的值并继续寻找下一个嵌套级别(基本上是递归概率)。请注意,如上所述,这还不是防弹实现。