python - 动态嵌套字典访问
问题描述
我有一个格式如下的字典:
input = {
'f1': {
'l1': { 'k1': 1.6, 't1': 1.4 },
'l2': { 'k1': 1.5, 'k2': 1.8, 't1': 1.3 }
}
}
字典的层次结构是:feature->level->{key=key,value=number}
对于每个特征中的每个级别,键(k1, k2, k3, ...)
的值都应该乘以 的值,'t1'
结果应该加回到键下的字典中"geo_" + key
。
例子:
l1
只有一个键 ( k1
) 可用,所以输出geo_k1 = k1 * t1
; 而l2
其中有两个键(k1
& k2
),所以会有两个输出:geo_k1 = k1 * t1
& geo_k2 = k2 * t1
。
预期输出:
output = {
'f1': {
'l1': { 'k1': 1.6, 't1': 1.4, 'final_k1': 2.24 },
'l2': { 'k1': 1.5, 'k2': 1.8, 't1': 1.3, 'final_k1': 1.95, 'final_k2': 2.34 }
}
}
我尝试使用以下代码,但不确定如何使其动态化:
for k, v in input.items():
for key, value in v.items():
print(value[l1]['k1'] * value[l1]['t1'])
解决方案
首先,让我们重命名input
为不覆盖内置函数的名称:
data = {
'f1': {
'l1': { 'k1': 1.6, 't1': 1.4 },
'l2': { 'k1': 1.5, 'k2': 1.8, 't1': 1.3 }
}
}
每个字典都有许多方法允许您迭代键、值或两者:和keys
,分别。事实上,字典本身是可以迭代它们的键的。在第一次嵌套时,您不关心功能名称或级别名称:values
items
for feature in data.values():
for level in feature.values():
接下来,让我们t1
从每个嵌套级别中获取乘数:
multiplier = level.get('t1', 1.0)
现在您正在对每个键集进行操作,因此您必须小心正确过滤。如果您尝试在level
迭代时进行修改,则会遇到问题,因此让我们遍历密钥列表的副本,并就地修改:
for key in list(level.keys()):
if key.startswith('k'):
level['geo_' + key] = level[key] * multiplier
过滤键的另一种方法是在循环中使用理解。例如,如果您允许键名以 , 以外的其他字母开头k
,并且只想省略t1
:
for key in [k for k in level if k != 't1']:
level['geo_' + key] = level[key] * multiplier
整个事情结合起来:
for feature in data.values():
for level in feature.values():
multiplier = level.get('t1', 1.0)
for key in [k for k in level if k != 't1']:
level['geo_' + key] = level[key] * multiplier
推荐阅读
- laravel - Laravel - 访问获取传递的变量?
- c# - 如何从 .Net Core 中的 HttpContext 访问声明?
- phpstorm - PhpStorm 显示我尝试编辑的文件不在我的项目中的对话框
- jquery - 如何使用未嵌套在 jquery 中的类查找下一个跨度
- http - 未处理的异常:错误状态:无法设置内容类型为“application/json”的请求的正文字段,并且 http post 中出现 415 错误
- javascript - Javascript:是否在构建中包含 package.json 依赖项,如果它没有在任何地方导入?
- qt - qt 设计师:如何关闭 dpi 缩放
- clickhouse - 从 csv 文件 clickhouse 读取时的代码 117
- python - python使用super()函数
- c# - 如何使用 Safari 浏览器的 selenium C# 切换到新选项卡