Python 访问嵌套字典中的值

Python 访问嵌套字典中的值,python,dictionary,Python,Dictionary,我是python新手,需要帮助解决一个问题: 我有一本像这样的字典 tmpDict = {'ONE':{'TWO':{'THREE':10}}} 除了“做”之外,我们还有其他方法来获取“三”的价值吗 tmpDict['ONE']['TWO']['THREE'] ?不,这些是嵌套字典,因此这是唯一的实际方法(您可以使用get(),但本质上是相同的)。然而,还有一种选择。您可以使用元组作为键,而不是嵌套字典: tempDict = {("ONE", "TWO", "THREE"): 10} te

我是python新手,需要帮助解决一个问题:

我有一本像这样的字典

tmpDict = {'ONE':{'TWO':{'THREE':10}}}
除了“做”之外,我们还有其他方法来获取“三”的价值吗

tmpDict['ONE']['TWO']['THREE']

不,这些是嵌套字典,因此这是唯一的实际方法(您可以使用
get()
,但本质上是相同的)。然而,还有一种选择。您可以使用元组作为键,而不是嵌套字典:

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

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

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

在python中,当然有几种方法可以做到这一点,但是有一种方法是显而易见的。

tmpdict[“一”][“二”][“三”]
是显而易见的方法

当这不适合您的算法时,这可能暗示您的结构不是解决问题的最佳结构

如果您只想保存重复键入,当然可以为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}}}
我的实施:

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")
>>>

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

答案已经由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纳秒±29.7纳秒(7次运行的平均值±标准偏差,每个10000000个回路)

每个回路235纳秒±9.82纳秒(7次运行的平均值±标准偏差,每个1000000个回路)


你为什么一开始就有这样一本字典?在每个级别上还有多少其他数据是您希望以一种简单的方式访问的?为什么您不想做
tmpDict['ONE']['TWO']['THREE']
?我不太清楚这在任何实际应用中会有什么好处。如果您的数据是结构化的,那么将其扁平化并提高关键复杂性似乎不会真正增加价值。@sr2222这意味着您不必拥有大量DICT,这意味着您在添加新值时不必担心创建子字典,而且根据应用程序的不同,这可能更自然。我认为在某些情况下,这足够值得一试了。如果返回的值是
None
,那么get不是用来事后检查的,你也可以检查键是否在字典中:
key in dict
或者对于较旧的版本
dict.has_key
tmpDict.get('ONE',{}.get('TWO',{}.get('TWO')。get('THREE)
使用默认为空dict的get。。。如果这三个键中的任何一个都不存在,它将返回
None
@dav1d为什么这么说。get不用于事后检查返回值是否为None?否则为什么会存在这种方法?的确,通过
[]
操作符访问dict的元素是一种显而易见的方法。但我强烈建议大家也阅读一个相关的问题。在现实情况下,必须将“路径”(可能长度可变)传递给嵌套(可能深度)字典中的元素,在每个中间dict上调用
get()
[]
运算符会很麻烦。但是,您不能为别名添加别名,因此,如果您计划以递归的方式多次执行该过程,那么您必须拥有密钥,否则它将在第二次传递值。