说我有两个这样的对象:
d={'a':{'z':1,'y':2},'b':{'z':0,'y':4}}
k=('a','y')
如何使用这两个对象获取:
>>> d['a']['y']
2
我需要它是动态的,所以这不会起作用:
d[k[0]][k[1]]
因为我并不总是确定字典的嵌套深度。 k
可能有一个或多个元素。
答案 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中没有自己的范围