<p>你可以用这个(相当不可读的)一行字:</p>
<pre><code>>>> [r['location'].get('street_1', None) if isinstance(r['location'], dict) else (r['location'] or None) for r in d]
[None, 'RR. E DURRESIT PALL. M.C.INERTE KATI 1 LAPRAKE']
</code></pre>
<p>最好使用完整的for循环:</p>
<pre><code>>>> l = []
>>> for r in d:
... loc = r['location']
... if isinstance(loc, dict):
... l.append(loc.get('street_1', None))
... else:
... l.append(loc or None)
...
>>> l
[None, 'RR. E DURRESIT PALL. M.C.INERTE KATI 1 LAPRAKE']
>>>
</code></pre>
<p>本质上,使用<code>isinstance</code>检查您是否正在使用<code>dict</code>。如果是,则使用<code>.get</code>,如果不是,则附加值。我使用<code>loc or None</code>,如果<code>loc</code>不是真的,它将求值为<code>None</code>,而<code>u""</code>恰好不是真的。你知道吗</p>
<p>另一种方法是<a href="https://docs.python.org/2/glossary.html#term-eafp" rel="nofollow noreferrer">EAFP</a>方法:</p>
<pre><code>>>> for r in d:
... loc = r['location']
... try:
... l.append(loc.get('street_1', None))
... except AttributeError:
... l.append(loc or None)
...
>>> l
[None, 'RR. E DURRESIT PALL. M.C.INERTE KATI 1 LAPRAKE']
</code></pre>
<p>使用这种方法或<a href="https://docs.python.org/2/glossary.html#term-lbyl" rel="nofollow noreferrer">LBYL</a>方法是否更有效取决于数据的性质。如果“异常”不是真正的异常,即它经常发生,那么LBYL方法实际上会更快,即使EAFP被认为是Pythonic。你知道吗</p>