我有一个代表字典中图层的列表:
layers = ('layer1', 'layer2', 'layer3')
我想从中动态创建一个字典,如下所示:
data = {'layer1': {'layer2': {'layer3': ...}}}
我希望能够在三个点的位置插入一个值。我还希望能够使用layers
列表动态访问此值。
我有一个代表字典中图层的列表:
layers = ('layer1', 'layer2', 'layer3')
我想从中动态创建一个字典,如下所示:
data = {'layer1': {'layer2': {'layer3': ...}}}
我希望能够在三个点的位置插入一个值。我还希望能够使用layers
列表动态访问此值。
所以当我输入这个问题时,我开始形成如何做到这一点的想法,然后我明白了。因此,为了将我的知识分享给任何可能需要它的人,就在这里。如果您知道更好的方法,欢迎您发布不同的解决方案!
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
所以我做了一个替代解决方案,使用 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