我觉得最近我看到了一种方法.假设我有一个空字典,我想在该空字典中的嵌套字典中设置一个值,但显然嵌套字典尚未创建.是否有一种创建中间键的方法?这就是我想要做的:
mydict = {}
mydict['foo']['bar']['foobar'] = 25
Run Code Online (Sandbox Code Playgroud)
如果执行此代码,您将获得'foo'的KeyError异常.是否有创建中间键的功能?
谢谢.
Dou*_*gal 17
from collections import defaultdict
recursivedict = lambda: defaultdict(recursivedict)
mydict = recursivedict()
Run Code Online (Sandbox Code Playgroud)
当您访问时mydict['foo'],它会设置mydict['foo']为另一个recursivedict.它实际上也会构造一个recursivedictfor mydict['foo']['bar']['foobar'],但是它会被分配给它而被抛出25.
另一种选择 - 根据您的用途,是使用元组作为键而不是嵌套字典:
mydict = {}
mydict['foo', 'bar', 'foobar'] = 25
Run Code Online (Sandbox Code Playgroud)
这将非常有效,除非您想在任何时候获得树的分支(在这种情况下您无法获得 mydict['foo'])。
如果您知道需要多少层嵌套,您也可以使用functools.partiallambda 来代替。
from functools import partial
from collections import defaultdict
tripledict = partial(defaultdict, partial(defaultdict, dict))
mydict = tripledict()
mydict['foo']['bar']['foobar'] = 25
Run Code Online (Sandbox Code Playgroud)
有些人发现它比等效的基于 lambda 的解决方案更具可读性,并且创建实例的速度更快:
python -m timeit -s "from functools import partial" -s "from collections import defaultdict" -s "tripledefaultdict = partial(defaultdict, partial(defaultdict, dict))" "tripledefaultdict()"
1000000 loops, best of 3: 0.281 usec per loop
python -m timeit -s "from collections import defaultdict" -s "recursivedict = lambda: defaultdict(recursivedict)" "recursivedict()"
1000000 loops, best of 3: 0.446 usec per loop
Run Code Online (Sandbox Code Playgroud)
尽管与往常一样,在知道存在瓶颈之前进行优化是没有意义的,所以在最快的之前选择最有用和最可读的。