0

我有一个代表字典中图层的列表:

layers = ('layer1', 'layer2', 'layer3')

我想从中动态创建一个字典,如下所示:

data = {'layer1': {'layer2': {'layer3': ...}}}

我希望能够在三个点的位置插入一个值。我还希望能够使用layers列表动态访问此值。

4

2 回答 2

0

所以当我输入这个问题时,我开始形成如何做到这一点的想法,然后我明白了。因此,为了将我的知识分享给任何可能需要它的人,就在这里。如果您知道更好的方法,欢迎您发布不同的解决方案!

def create_deep_dict(value, layers):

    data = {}
    layer = layers[0]

    if layers[1:]:
        data[layer] = create_deep_dict(value, layers[1:])
    else:
        data[layer] = value

    return data

def deep_dict_value(data, layers):

    layer = layers[0]

    if layers[1:]:
        return deep_dict_value(data[layer], layers[1:])
    else:
        return data[layer]

因此,如果您像这样使用这些功能:

layers = ['layer1', 'layer2', 'layer3']

print 'create deep dict:'
data = create_deep_dict(layers, 'hello')
print data

print '\nretrieve value from deep dict:'
print deep_dict_value(layers, data)

它将输出:

create deep dict:
{'layer1': {'layer2': {'layer3': 'hello'}}}

retrieve value from deep dict:
hello
于 2013-11-12T18:34:55.833 回答
0

所以我做了一个替代解决方案,使用 for 循环而不是递归调用函数。我对这两种方法进行了基准测试,随着层数和函数调用的增加,循环方法变得更快。

def create_deep_dict(value, layers):

    orig_data = {}
    data = orig_data
    last_layer = layers[-1]

    for layer in layers[:-1]:
        data[layer] = {}
        data = data[layer]

    data[last_layer] = value

    return orig_data

def deep_dict_value(data, layers):

    for layer in layers:
        data = data[layer]

    return data
于 2013-11-13T11:57:04.350 回答