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

时间:2012-12-13 04:20:20

标签: 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'作为键,然后重新调整它然后使用'c'作为关键。显然,如果从第一次查找返回的值不是字典,它将返回错误。

5 个答案:

答案 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.reduceoperator.getitem的紧凑型解决方案:

from functools import reduce
from operator import getitem

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

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