Python 使用单个变量索引到嵌套字典

Python 使用单个变量索引到嵌套字典,python,dictionary,Python,Dictionary,假设您有一个python字典:myDic={'a':1,'b':{'c':2,'d':3}。您当然可以将变量设置为键值并在以后使用,例如: myKey = 'b' myDic[myKey] >>> {'c':2, 'd':3} 然而,有没有一种方法可以将一个变量设置为一个值,当用作键时,它也会深入到子字典中?有没有办法在python中完成以下伪代码 myKey = "['b']['c']" myDic[myKey] >>> 2 因此,首先它使用“b”作为密

假设您有一个python字典:
myDic={'a':1,'b':{'c':2,'d':3}
。您当然可以将变量设置为键值并在以后使用,例如:

myKey = 'b'
myDic[myKey]
>>> {'c':2, 'd':3}
然而,有没有一种方法可以将一个变量设置为一个值,当用作键时,它也会深入到子字典中?有没有办法在python中完成以下伪代码

myKey = "['b']['c']"
myDic[myKey]
>>> 2

因此,首先它使用“b”作为密钥,然后无论重新聚合什么,它都使用“c”作为密钥。显然,如果第一次查找返回的值不是字典,它将返回错误。

否,不是常规dict。使用
myDict[key]
您只能访问实际为
myDict
值的值。但是如果
myDict
包含其他dict,则这些嵌套dict的值不是
myDict
的值

根据您对数据结构所做的操作,可以使用元组键而不是嵌套的dict来获得所需的内容。您可以使用
myDic={'b':{'c':2,'d':3}
,而不是
myDic={'b','c'):2,('b','d'):3}
。然后您可以使用类似于
myDic['b','c']
的方法访问这些值。你确实可以做到:

val = 'b', 'c'
myDic[val]

不,没有任何东西可以放入变量中,
myDict[myKey]
将深入到嵌套字典中

以下是一个可供选择的功能:

def recursive_get(d, keys):
    if len(keys) == 1:
        return d[keys[0]]
    return recursive_get(d[keys[0]], keys[1:])
例如:

>>> myDic = {'a':1, 'b':{'c':2, 'd':3}}
>>> recursive_get(myDic, ['b', 'c'])
2

好吧,你不能。如果您考虑python的工作方式,它会从左到右从内到外进行计算
[]
在本例中是
\uu getitem\uuuu
的缩写。因此,您需要解析传递到
\uuu getitem\uuuu
中的参数(无论传递什么),并智能地处理这些参数。如果你想有这样的行为,你需要为你自己的
dict
类创建子类/编写子类。

这是一个很老的问题。没有内置的功能

myDict = {'a':1, 'b':{'c':2, 'd':3}}
k = 'b'

myDict.get(k) should give
{'c':2, 'd':3}

and either
d.get(k)['c'] 
OR

k1 = 'c'
d.get(k).key(k1) should give 2
使用
functools.reduce
操作符压缩解决方案。getitem

from functools import reduce
from operator import getitem

d = {'a': {'b': ['banana', 'lemon']}}
p = ['a', 'b', 1]

v = reduce(getitem, p, d)
# 'lemon'

看到Ok的答案了吗?我最初考虑只实现您在这里展示的递归方法,但我坚持要看看是否有内置的东西来完成这项工作,因为我还需要这个嵌套功能来设置值并检查dic中是否嵌套了键。但既然没有替代方案,我就接受这个答案,然后手动实现任何其他功能。啊,现在我明白为什么我不能这么做了。谢谢你的解释。