我是 python 新手,需要帮助解决问题:
我有一本像
tmpDict = {'ONE':{'TWO':{'THREE':10}}}
除了做之外,我们还有其他方式来获取 THREE 的价值吗?
tmpDict['ONE']['TWO']['THREE']
?
我是 python 新手,需要帮助解决问题:
我有一本像
tmpDict = {'ONE':{'TWO':{'THREE':10}}}
除了做之外,我们还有其他方式来获取 THREE 的价值吗?
tmpDict['ONE']['TWO']['THREE']
?
在 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}}}
您可以在每个字典上使用 get() 。确保您已为每个访问添加了无检查。
我的实现:
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 值。
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 次循环)
不,那些是嵌套字典,所以这是唯一真正的方法(你可以使用get()
,但本质上是一样的)。但是,还有另一种选择。您可以使用元组作为键来代替嵌套字典:
tempDict = {("ONE", "TWO", "THREE"): 10}
tempDict["ONE", "TWO", "THREE"]
这确实有一个缺点,例如,没有(简单和快速)获取所有元素的"TWO"
方法,但如果这无关紧要,这可能是一个很好的解决方案。