我是python的新手,在解决问题方面需要帮助:
我有一个像
这样的词典tmpDict = {'ONE':{'TWO':{'THREE':10}}}
除了做
之外,我们还有其他任何方式可以访问THREE的价值吗?tmpDict['ONE']['TWO']['THREE']
答案 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"
的所有元素的方法,但如果这无关紧要,这可能是一个很好的解决方案。