<p>我过去也遇到过类似的问题。我发现<code>defaultdict</code>对我来说是正确的答案,但是写超长的定义(比如@o11c的答案或@Apero的答案)并不好。我想到的是:</p>
<pre><code>from collections import defaultdict
from functools import partial
def NestedDefaultDict(levels, baseFn):
def NDD(lvl):
return partial(defaultdict, NDD(lvl-1)) if lvl > 0 else baseFn
return defaultdict(NDD(levels-1))
</code></pre>
<p>这将创建一个包含<code>levels</code>个嵌套字典的字典。因此,如果<code>levels</code>=3,则需要3个键来访问底层值。第二个参数是用于创建底层值的函数。像<code>list</code>或者<code>lambda: 0</code>或者甚至<code>dict</code>这样的东西都能很好地工作。你知道吗</p>
<p>下面是一个使用4<code>levels</code>和<code>list</code>作为默认函数的“自动”键的示例:</p>
<pre><code>>>> x = NestedDefaultDict(4, list)
>>> x[1][2][3][4].append('hello')
>>> x
defaultdict(<functools.partial object at 0x10b5c22b8>, {1: defaultdict(<functools.partial object at 0x10b5c2260>, {2: defaultdict(<functools.partial object at 0x10b5c2208>, {3: defaultdict(<type 'list'>, {4: ['hello']})})})})
</code></pre>
<p>我想这基本上就是你想问的问题。您的4个“级别”是<em>交换机名称、邻居名称、本地和端口</em>——看起来您希望在底层有一个<code>list</code>来存储端口。你知道吗</p>
<p>另一个使用2 <code>levels</code>和<code>lambda: 0</code>作为默认值的示例:</p>
<pre><code>>>> y = NestedDefaultDict(2, lambda: 0)
>>> y['foo']['bar'] += 7
>>> y['foo']['baz'] += 10
>>> y['foo']['bar'] += 1
>>> y
defaultdict(<functools.partial object at 0x1021f1310>, {'foo': defaultdict(<function <lambda> at 0x1021f3938>, {'baz': 10, 'bar': 8})})
</code></pre>