为了账号安全,请及时绑定邮箱和手机立即绑定

动态嵌套字典访问

动态嵌套字典访问

凤凰求蛊 2023-06-06 17:25:49
我有以下格式的字典: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'])
查看完整描述

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


查看完整回答
反对 回复 2023-06-06
?
DIEA

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:字典在迭代期间改变了大小


查看完整回答
反对 回复 2023-06-06
  • 2 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信