4

想象一下,你有一个 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”作为键。显然,如果从第一次查找返回的值不是字典,它将返回错误。

4

5 回答 5

5

不,您不能将任何内容放入变量中,以便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
于 2012-12-13T04:27:15.800 回答
3

不,不是普通的听写。您只能访问myDict[key]实际上是. myDict但如果myDict包含其他字典,则这些嵌套字典的值不是myDict.

根据您对数据结构所做的工作,可以通过使用元组键而不是嵌套字典来获得所需的内容。而不是拥有myDic = {'b':{'c':2, 'd':3}},你可以拥有myDic = {('b', 'c'):2, ('b', 'd'): 3}。然后你可以使用类似的东西访问这些值myDic['b', 'c']。你确实可以这样做:

val = 'b', 'c'
myDic[val]
于 2012-12-13T04:26:22.993 回答
2

AFAIK,你不能。如果您考虑 python 的工作方式,它会从内到外从左到右进行评估。 []__getitem__在这种情况下的简写。因此,您需要解析您传入的参数__getitem__(无论您传入什么)并智能地处理它。如果你想有这样的行为,你需要继承/编写你自己的dict类。

于 2012-12-13T04:27:32.877 回答
0
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
于 2012-12-13T04:33:04.250 回答
0

很老的问题。没有内置函数。

functools.reduce使用和的紧凑解决方案operator.getitem

from functools import reduce
from operator import getitem

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

v = reduce(getitem, p, d)
# 'lemon'
于 2020-09-06T18:13:11.667 回答