41

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

我有一本像

tmpDict = {'ONE':{'TWO':{'THREE':10}}}

除了做之外,我们还有其他方式来获取 THREE 的价值吗?

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

?

4

5 回答 5

35

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

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

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

如果您只想节省重复输入,您当然可以为字典的一个子集起别名:

>>> 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}}}
于 2012-05-01T15:15:27.220 回答
13

您可以在每个字典上使用 get() 。确保您已为每个访问添加了无检查。

于 2012-05-01T15:10:53.203 回答
13

我的实现:

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

如果缺少键,则不会引发异常,在这种情况下返回 None 值。

于 2017-12-28T10:01:48.000 回答
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')

给我们 :

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

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

于 2018-08-24T09:23:09.730 回答
3

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

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

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

于 2012-05-01T15:06:37.047 回答