<p>并非所有的值都是字典;有些是字符串:</p>
<pre><code># ...
'in_bruges': {
'display': 'In Bruges',
'actors': {
# ...
</code></pre>
<p>那是一个字符串和一本字典。你必须改变你的处理方式:</p>
<pre><code>for movie, val in movies.iteritems():
print movie
for v in val.values():
if hasattr(v, 'values'):
for x in v.values():
print x
else:
print v
</code></pre>
<p>在这里,我使用了ducktyping;检查我想要使用的方法,而不是类型;如果它存在,我们假设它可以被视为字典。您也可以使用<code>isinstance(v, dict)</code>,但是上面的方法更加灵活,因为它允许使用正确方法的任何东西都被同等对待。你知道吗</p>
<p>可以使用递归处理任意深度的任意值:</p>
<pre><code>def print_dictionary(d, indent=0):
try:
for k, v in d.iteritems():
print (indent * ' '), k, '->'
print_dictionary(v, indent + 1)
except AttributeError:
print (indent * ' '), d
</code></pre>
<p>这里我使用了异常处理;如果<code>dict.iteritems()</code>方法不存在,则会引发<code>AttributeError</code>。这种技巧叫做“三思而后行”。你知道吗</p>
<p>使用演示词典,可以输出:</p>
<pre><code>>>> print_dictionary(movies)
fargo ->
actors ->
William H. Macy ->
age ->
109
height ->
120
Steve Buscemi ->
age ->
11
height ->
118
display ->
Fargo
in_bruges ->
actors ->
Brendan Gleeson ->
age ->
88
height ->
158
Colin Farrel ->
age ->
99
height ->
160
display ->
In Bruges
</code></pre>