当密钥存储在另一个对象中时,如何访问字典值?

时间:2016-06-28 17:06:06

标签: python

说我有两个这样的对象:

d={'a':{'z':1,'y':2},'b':{'z':0,'y':4}}
k=('a','y')

如何使用这两个对象获取:

>>> d['a']['y'] 
2

我需要它是动态的,所以这不会起作用:

d[k[0]][k[1]]

因为我并不总是确定字典的嵌套深度。 k可能有一个或多个元素。

2 个答案:

答案 0 :(得分:6)

try:                  
    # python 3 maybe?
    from functools import reduce                  

except ImportError:
    # assume python 2...
    pass                  

reduce(dict.__getitem__, k, d)

请求了一些解释:reduce(fn,[a1,a2,a3 ...],b)转换为:fn(... fn(fn(b,a1),a2),a3 )...)。所以,它配对了一些"累加器"具有序列中连续值的值,将其传递给传入的函数,然后使用它来更新"累加器"值。

所以我们的"累加器" value是顶级字典,我们将它作为第一个(" self")参数传递给字典方法__getitem__,它实现了下标操作符。

如下面的评论中所述,您可以使用operator.getitem到位dict.__getitem__来推广支持索引的其他数据类型,例如列表,元组,字符串......

答案 1 :(得分:0)

我认为亚当的解决方案是迄今为止更清晰的解决方案,但由于功能方法总是有必要的替代方案,我们也可以递归地解决这个问题:

 def get(d,k):
     if len(k) == 1:
             return d[k[0]]
     return get(d[k[0]], k[1:])

与for循环类似:

result = d.copy()
for key in k:
    result = result[key]

注意循环在python中没有自己的范围