基于键更新嵌套dict中的值



我有一个嵌套字典,我想根据键值更新项的值。例如,我有下面的字典,我想将关键字为=='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')

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

如果字典的最大深度是已知且恒定的,并且'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)代替它。它们是一样的东西。

也许这可以让你开始(你仍然可以让它更通用,而且它可能有重复键的问题(:

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是决定是更新给定条目还是返回该键的值,并继续寻找下一个嵌套级别的函数(基本上是递归问题(。请注意,如上所述,这还不是一个防弹的实现。

最新更新