首页 > 解决方案 > 动态嵌套字典访问

问题描述

我有一个格式如下的字典:

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'])

标签: pythondictionary

解决方案


首先,让我们重命名input为不覆盖内置函数的名称:

data = {
    'f1': {
        'l1': { 'k1': 1.6, 't1': 1.4 },
        'l2': { 'k1': 1.5, 'k2': 1.8, 't1': 1.3 }
    }
}

每个字典都有许多方法允许您迭代键、值或两者:和keys,分别。事实上,字典本身是可以迭代它们的键的。在第一次嵌套时,您不关心功能名称或级别名称:valuesitems

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

推荐阅读