想象一下你在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'作为关键。显然,如果从第一次查找返回的值不是字典,它将返回错误。
答案 0 :(得分: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
答案 1 :(得分:3)
不,不是常规词典。使用myDict[key]
,您只能访问实际值为myDict
的值。但如果myDict
包含其他dicts,则这些嵌套dicts的值不是myDict
的值。
根据您对数据结构所做的操作,可以通过使用元组键而不是嵌套的dicts来获得所需的内容。您可以拥有myDic = {'b':{'c':2, 'd':3}}
,而不是拥有myDic = {('b', 'c'):2, ('b', 'd'): 3}
。然后,您可以使用myDic['b', 'c']
之类的内容访问这些值。你确实可以这样做:
val = 'b', 'c'
myDic[val]
答案 2 :(得分:2)
AFAIK,你做不到。如果你考虑python的工作方式,它会从里到外,从左到右进行评估。在这种情况下,[]
是__getitem__
的简写。因此,您需要解析传递给__getitem__
的参数(无论您传入的是什么)并智能地处理它。如果你想有这样的行为,你需要继承/编写自己的dict
类。
答案 3 :(得分: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
答案 4 :(得分:0)
相当老的问题。没有内置功能。</ p>
使用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'