2013-07-06 49 views
1

在python 3中,我需要一個函數從嵌套鍵動態返回一個值。列表索引必須是整數python嵌套字典

nesteddict = {'a':'a1','b':'b1','c':{'cn':'cn1'}} 
print(nesteddict['c']['cn']) #gives cn1 

def nestedvalueget(keys): 
    print(nesteddict[keys]) 

nestedvalueget(['n']['cn']) 

如何編寫nestedvalueget?

我不確定標題是否正確表達,但我不確定如何最好地描述這一點。

回答

2

如果你想穿越詞典,使用循環:

def nestedvalueget(*keys): 
    ob = nesteddict 
    for key in keys: 
     ob = ob[key] 
    return ob 

或使用functools.reduce()

from functools import reduce 
from operator import getitem 

def nestedvalueget(*keys): 
    return reduce(getitem, keys, nesteddict) 

然後使用版本爲:

nestedvalueget('c', 'cn') 

注意,任一版本採用可變數量的參數讓您可以將0個或更多個鍵作爲位置參數。

演示:

>>> nesteddict = {'a':'a1','b':'b1','c':{'cn':'cn1'}} 
>>> def nestedvalueget(*keys): 
...  ob = nesteddict 
...  for key in keys: 
...   ob = ob[key] 
...  return ob 
... 
>>> nestedvalueget('c', 'cn') 
'cn1' 
>>> from functools import reduce 
>>> from operator import getitem 
>>> def nestedvalueget(*keys): 
...  return reduce(getitem, keys, nesteddict) 
... 
>>> nestedvalueget('c', 'cn') 
'cn1' 

,並闡明你的錯誤信息:您通過表達['n']['cn']你的函數調用,它定義了一個元素(['n']),然後您可以嘗試指數與'cn'名單,一個字符串。列表索引只能是整數:

>>> ['n']['cn'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 
>>> ['n'][0] 
'n' 
+0

functools.reduce()是我正在尋找的。謝謝! – Eugene

相關問題