2013-07-06 50 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

相关问题