访问嵌套字典中的值

Gan*_*ana 27 python dictionary

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

我有一本字典

tmpDict = {'ONE':{'TWO':{'THREE':10}}}
Run Code Online (Sandbox Code Playgroud)

除了这样做之外,我们还有其他任何方式可以访问THREE的价值吗?

tmpDict['ONE']['TWO']['THREE']
Run Code Online (Sandbox Code Playgroud)

ch3*_*3ka 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}}}
Run Code Online (Sandbox Code Playgroud)

  • 确实,通过“[]”运算符访问字典的元素是一种显而易见的方法。但我强烈建议您也阅读相关问题的[此答案](/sf/answers/3658246441/)。在现实场景中,人们必须将“路径”(可能是可变长度)传递给(可能是深层)嵌套字典中的元素,在这种情况下调用“get()”或“[]”运算符会很麻烦。每个中间字典。 (2认同)

小智 9

我的实施:

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:])
Run Code Online (Sandbox Code Playgroud)

用法示例:

>>> 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")
>>>
Run Code Online (Sandbox Code Playgroud)

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


Siv*_*lam 7

你可以在每个字典上使用get().确保为每次访问添加了None检查.

  • `tmpDict.get('ONE',{}).get('TWO',{}).get('THREE')`使用get with empty dict作为默认值...如果三个键中的任何一个没有存在,它将返回"无" (11认同)

May*_*sgc 5

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

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

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

给我们 :

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

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