最近我好像看到有一种方法可以实现这个。假设我有一个空字典,我想在其中的一个嵌套字典中设置值,但很显然,那个嵌套字典尚未创建。是否有一种一行的方式来创建中间键?这就是我想要做的:
mydict = {}
mydict['foo']['bar']['foobar'] = 25
如果你执行这段代码,会出现针对 'foo' 的 KeyError 异常。是否有一种方法可以创建中间键?谢谢。
最近我好像看到有一种方法可以实现这个。假设我有一个空字典,我想在其中的一个嵌套字典中设置值,但很显然,那个嵌套字典尚未创建。是否有一种一行的方式来创建中间键?这就是我想要做的:
mydict = {}
mydict['foo']['bar']['foobar'] = 25
如果你执行这段代码,会出现针对 'foo' 的 KeyError 异常。是否有一种方法可以创建中间键?from collections import defaultdict
recursivedict = lambda: defaultdict(recursivedict)
mydict = recursivedict()
当你访问mydict['foo']
时,它会将mydict['foo']
设置为另一个recursivedict
。它实际上会构造一个recursivedict
用于mydict['foo']['bar']['foobar']
,但是在将其赋值为25
时,它将被丢弃。mydict['foo'] = 15⏎ mydict['foo']['bar']['foobar'] = 25
。在大型代码库中,原始问题的提出者可能无法记住先前分配的值。 - nehem__getitem__
返回包装器,覆盖存储元素的 __getitem__
,这将使将列表或其他内容放入字典变得棘手。 - Danica另一种选择(取决于您的用途)是使用元组作为键,而不是嵌套的字典:
mydict = {}
mydict['foo', 'bar', 'foobar'] = 25
functools.partial
而不是lambda。from functools import partial
from collections import defaultdict
tripledict = partial(defaultdict, partial(defaultdict, dict))
mydict = tripledict()
mydict['foo']['bar']['foobar'] = 25
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
然而,一如既往,没有必要优化,直到你知道瓶颈在哪里,因此在优先考虑最有用和易读的内容之前,请选择最快的内容。
prefix = ('foo', 'bar'); l = len(prefix); branch = { k[l:]: v for k, v in mydict.items() if k[:l] == prefix}
-- 尽管需要遍历所有键。 - Danica不确定你为什么想要这样做,但:
>>> from collections import defaultdict as dd
>>> mydict = dd(lambda: dd(lambda: {}))
>>> mydict['foo']['bar']['foobar'] = 25
>>> mydict
defaultdict(<function <lambda> at 0x021B8978>, {'foo': defaultdict(<function <lambda> at 0x021B8618>, {'bar': {'foobar': 25}})})