<p>您可以尝试使用<code>defaultdict</code>,参数是<code>defaultdict(dict)</code>。无论何时尝试引用不存在的值,它都不会引发错误,而是返回指定值的默认空值:</p>
<pre><code>In [7]: from collections import defaultdict
In [8]: lovedsongs = defaultdict(lambda: defaultdict(dict))
In [9]: lovedsongs['OAR']['Blackrock'] = 1
In [10]: lovedsongs['Timati']['Moj Put'] = 1
In [11]: lovedsongs
Out[11]: defaultdict(<function <lambda> at 0x24e5ed8>, {'Timati': defaultdict(<type 'dict'>, {'Moj Put': 1}), 'OAR': defaultdict(<type 'dict'>, {'Blackrock': 1})})
In [12]: lovedsongs['Not']['Found']
Out[12]: {}
In [13]: if lovedsongs['Not']['Found'] == 1:
....: print 'Found it'
....:
....:
In [14]: if lovedsongs['OAR']['Blackrock'] == 1:
....: print 'Found it'
....:
....:
Found it
</code></pre>
<p>通过观察单个级别(即“更规则”)<code>defaultdict</code>的工作方式,可以更好地理解<code>defaultdict(lambda: defaultdict(dict))</code>语法:</p>
^{pr2}$
<p>我们用一个参数<code>int</code>声明了<code>defaultdict</code>-这意味着如果找不到值,而不是抛出错误,我们将只返回{<cd7>}(因为<code>0</code>是一个整数的空值)。如果我们使用<code>str</code>,我们将得到<code>''</code>,如果我们使用<code>dict</code>,我们将得到一本字典。然而,这种情况下最棘手的部分是您有一个嵌套字典(<code>defaultdict(dict)</code>),如果您试图引用嵌套字典中不存在的键,则会遇到相同的问题:</p>
<pre><code>In [13]: d = defaultdict(dict)
In [14]: d['three']['more']
-
KeyError Traceback (most recent call last)
/path/<ipython console> in <module>()
KeyError: 'more'
</code></pre>
<p>因此,为了使我们的嵌套字典也成为<code>defaultdict</code>,我们必须做一些技巧:因为<code>defaultdict</code>的参数是需要可调用的(但尚未调用->;请参见<code>int</code>与<code>int()</code>),我们使用一个<code>lambda</code>函数来模拟这种行为。在一个非常简单的层次上,可以将<code>lambda</code>看作是阻止{<cd2>}在需要之前被调用。现在,您将拥有一个字典(带有嵌套字典),它将处理两个级别的缺失键,而不会引发错误。希望能解释一下。在</p>