访问嵌套字典中的值

时间:2012-05-01 15:03:20

标签: python dictionary

我是python的新手,在解决问题方面需要帮助:

我有一个像

这样的词典
tmpDict = {'ONE':{'TWO':{'THREE':10}}}

除了做

之外,我们还有其他任何方式可以访问THREE的价值吗?
tmpDict['ONE']['TWO']['THREE']

5 个答案:

答案 0 :(得分:29)

与python一样,当然有几种方法可以做到,但有一种明显的方法可以做到。

tmpdict["ONE"]["TWO"]["THREE"] 显而易见的方法。

当这与您的算法不匹配时,这可能暗示您的结构不是最佳问题。

如果你只想保存重复输入,你当然可以为dict的一个子集添加别名:

>>> two_dict = tmpdict['ONE']['TWO'] # now you can just write two_dict for tmpdict['ONE']['TWO']
>>> two_dict["spam"] = 23
>>> tmpdict
{'ONE': {'TWO': {'THREE': 10, 'spam': 23}}}

答案 1 :(得分:8)

我的实施:

def get_nested(data, *args):
    if args and data:
        element  = args[0]
        if element:
            value = data.get(element)
            return value if len(args) == 1 else get_nested(value, *args[1:])

使用示例:

>>> dct={"foo":{"bar":{"one":1, "two":2}, "misc":[1,2,3]}, "foo2":123}
>>> get_nested(dct, "foo", "bar", "one")
1
>>> get_nested(dct, "foo", "bar", "two")
2
>>> get_nested(dct, "foo", "misc")
[1, 2, 3]
>>> get_nested(dct, "foo", "missing")
>>>

如果缺少密钥,则不会引发异常,在这种情况下不返回任何值。

答案 2 :(得分:6)

您可以在每个dict上使用get()。确保为每次访问添加了None检查。

答案 3 :(得分:2)

答案已经由Sivasubramaniam Arunachalam或ch3ka给出。

我只是添加答案的表演视图。

dicttest={}
dicttest['ligne1']={'ligne1.1':'test','ligne1.2':'test8'}
%timeit dicttest['ligne1']['ligne1.1']
%timeit dicttest.get('ligne1').get('ligne1.1')

给予我们:

  

每个循环112 ns±29.7 ns(平均±标准偏差,共运行7次,每个循环10000000次)

     

每个循环235 ns±9.82 ns(平均±标准偏差,共运行7次,每个循环1000000次)

答案 4 :(得分:1)

不,那些是嵌套的词典,所以这是唯一真正的方法(你可以使用get(),但实质上它是一样的)。但是,还有另一种选择。您可以使用元组作为键来代替嵌套字典:

tempDict = {("ONE", "TWO", "THREE"): 10}
tempDict["ONE", "TWO", "THREE"]

这确实有一个缺点,例如,没有(简单快速)获取"TWO"的所有元素的方法,但如果这无关紧要,这可能是一个很好的解决方案。