2013-11-12 4 views
0

У меня есть список, который представляет собой слои в Словаре:Динамически глубоко питон ДИКТ

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

Я хочу, чтобы динамически создать словарь из этого, что выглядит следующим образом:

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

I хотите иметь возможность вставить значение в положение трех точек. Я также хочу иметь возможность динамически получать доступ к этому значению с помощью списка layers.

+0

возможно дубликат [питон доступа вложенного словаря элементов с помощью списка ключей] (http://stackoverflow.com/questions/14692690/access-python-nested-dictionary-items-via-a-list- из-за ключей) и [индексы индексов должны быть целыми числами вложенных словарей python] (http://stackoverflow.com/q/17503150) –

ответ

0

Так что я сделал альтернативное решение, которое использует для петель вместо вызова функции рекурсивно , Я сравнивал оба подхода, и метод цикла оказывается намного быстрее, поскольку вы увеличиваете количество уровней и вызовов функций.

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 
+0

Это было бы потому, что в стеке нет дополнительных вызовов и контекстов функций, а также не подгоняется слоям [: -1], слои [: - 2] и т. Д. Язык с оптимизацией хвостового вызова и неизменяемыми списками (например, Haskell) может устранить эту разницу, но, как показано выше, более быстрая версия также более читаема. –

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 
Смежные вопросы