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

LMc*_*LMc 3 python

说我有两个这样的对象:

d={'a':{'z':1,'y':2},'b':{'z':0,'y':4}}
k=('a','y')
Run Code Online (Sandbox Code Playgroud)

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

>>> d['a']['y'] 
2
Run Code Online (Sandbox Code Playgroud)

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

d[k[0]][k[1]]
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*ski 6

try:                  
    # python 3 maybe?
    from functools import reduce                  

except ImportError:
    # assume python 2...
    pass                  

reduce(dict.__getitem__, k, d)
Run Code Online (Sandbox Code Playgroud)

请求解释的位:减少(FN,[A1,A2,A3 ...],B)转换成:FN(FN ...(FN(FN(B,A1),a2)中,a3)的.. ).因此,它将一些"累加器"值与序列中的连续值配对,将其传递给传入的函数,然后使用它来更新"累加器"值.

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

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

  • `reduce`已被埋没在python 3中的`functools`中. (2认同)
  • @LMc:要增加最里面的dict中的值,请执行`*k,last_k = k`.然后做`reduce(dict .__ getitem __,k,d)[last_k] + = 1`.这将适用于任何嵌套级别.给定'd = {'a':{'b':{'c':1}},'d':1}`它将在`k =('a','b','c')的情况下工作`和where`k =('d',)`. (2认同)