2 回答
TA贡献1890条经验 获得超9个赞
首先,让我们重命名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
TA贡献1820条经验 获得超2个赞
在您的内部循环中,检查密钥是否以k. 如果是,则执行乘法并创建相应的geo_kX密钥。
for k1, v1 in input.items():
for k2, v2 in v1.items():
for k3, v3 in list(v2.items()):
if k3.startswith('k'):
v2['geo_' + k3] = v2['t1'] * v3
有必要使用list(v2.items())来避免错误:
RuntimeError:字典在迭代期间改变了大小
添加回答
举报