python - Python嵌套字典更新任何嵌套键匹配的值
问题描述
我有一个嵌套字典,其中每个元素都可以是任何类型,包括列表或字典。我正在寻找一种方法来使用特定值更新任何深度的任何键。(因此,如果目标值不是列表或字典,则会发生替换)
例如
{
'a': 1,
'b': 2,
'c': [{'a': 2, 'b': 3}],
'd': [{'d_d': {'a': 1, 'b': 2}}],
'e': {'a': 4},
}
会成为
{
'a': 'xx',
'b': 2,
'c': [{'a': 'xx', 'b': 3}],
'd': [{'d_d': {'a': 'xx', 'b': 2}}],
'e': {'a': 'xx'},
}
函数采用字典、键和新值,就像这样
update_nested(dict, key='a', value='xx')
解决方案
让我们看看您需要哪些部分以及如何实现它们:
遍历字典
有三种不同的方法可以帮助您遍历字典:
dict.keys()
遍历字典中的所有键。例如
for key in {"Hello": 10, "World", 20}.keys():
print(k)
# output: Hello\nWorld
dict.items()
遍历(key, value)
字典中的所有元组。for k, v in d.items()
dict.values()
遍历字典中的所有值。for v in d.values()
处理嵌套字典
当您有嵌套结构时,一个好的概念将递归
简而言之:您使用不同的参数调用同一函数本身。
把这两个概念放在一起。
- 遍历数组
- 如果键与您要搜索的键相同:替换值
- 如果值是字典:再次调用函数,将值作为字典参数
- 如果值是一个列表:遍历所有项目并检查它们是否是 dicts。如果是这样,像上面一样处理它们
可能的最终代码:
def update_nested(in_dict, key, value):
for k, v in in_dict.items():
if key == k:
in_dict[k] = value
elif isinstance(v, dict):
update_nested(v, key, value)
elif isinstance(v, list):
for o in v:
if isinstance(o, dict):
update_nested(o, key, value)
额外说明:
您永远不应该使用内置名称/类型作为变量名。在你的情况下dict
。这将覆盖内置类型并可能导致意外行为。
推荐阅读
- python - 如何为 discord.py 制作视频流机器人?
- android - 我可以从 Android 上的 Sentry 报告中过滤掉某些事件吗?
- jboss - Wildfly/JBoss CLI:如何将变量设置为表达式的结果?
- nhibernate - 当前不支持 exceptResultOperator 结果运算符
- command-line - 删除文件中的 ~\r\n 个字符
- javascript - javascript - Firestore 检查用户名是否已存在
- java - 用java在一个txt文件的列中排序N个数字行
- arrays - 循环数组,进行比较和保存数据的算法
- python - 如何使用 python-gnutls 发送 HTTP 请求
- c++ - 为什么在 C++ 中可以在头文件中定义成员函数而不是自由函数?