2015-02-04 2 views
0

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

Проблема заключается в том, что словарь может иметь любое количество слоев, поэтому это не просто случай хранения финального ключа. Например, в нижеследующем я обращаюсь к ['dig'] ['result'], но это может быть равно ['output'] или ['some'] ['thing'] ['strange']

if result: 
     if self.cli_args.json: 
      pprint(result) 
     else: 
      print result['dig']['result'] 

я мог сохранить ключ в виде строки и использовать Eval() в чем-то, такие как:

key="['test']" 
test_dict = { "test" : "This works" } 
eval("test_dict" + key) 
>>> 'This works' 

Но Eval действительно грязная правда? :-)

Есть ли хороший/путинский способ сделать это?

ответ

2

Чтобы обработать произвольную глубину вложенности ключа, вы можете перебирать последовательность (например, кортеж) из ключей:

>>> d = {'a': {'b': {'c': 'd'}}} 
>>> d['a']['b']['c'] 
'd' 
>>> keys = ('a', 'b', 'c') # or just 'abc' for this trivial example 
>>> content = d 
>>> for k in keys: 
    content = content[k] 


>>> content 
'd' 
+0

Это выглядит очень многообещающим – joeButler

1
>>> def access(o,path): 
... for k in path.split('/'): 
...  o = o[k] 
... return o 
... 
>>> access({'a': {'b': {'c': 'd'}}},'a/b/c') 
'd' 
+0

Если вы 'path' последовательность (например, 'access ({'a': {'b': {'c': 'd'}}}, 'abc')' или 'access ({'a': {'b': {'c': 'd'}}}, ('a', 'b', 'c'))), вы можете разделить разбиение и разрешить '/' в ключах. – jonrsharpe

Смежные вопросы