<p>使用<a href="https://docs.python.org/3/glossary.html#term-generator" rel="nofollow noreferrer">generator</a>(<a href="https://stackoverflow.com/q/231767/7311767">^{<cd1>}</a>语句)可以递归地执行以下操作:</p>
<h3>代码:</h3>
<pre><code>def recursive(src, so_far=()):
if isinstance(src, dict):
for key, value in src.items():
yield from recursive(value, so_far + (key,))
elif isinstance(src, list):
for item in src:
yield from recursive(item, so_far)
else:
yield ' '.join(so_far + (src,))
</code></pre>
<p>需要注意的一点是需要从递归到的生成器中重新生成结果。在这里使用:</p>
<pre><code>yield from recursive(item, so_far)
</code></pre>
<p>相当于:</p>
<pre><code>for i in recursive(item, so_far):
yield i
</code></pre>
<h3>测试代码:</h3>
<pre><code>example_dict = {
'key1': 'value1',
'key2': {
'key2a': 'value2a'
},
'key3': {
'key3a': {
'key3aa': 'value3aa',
'key3ab': 'value3ab',
'key3ac': 'value3ac'
},
'key3b': [
'value3b1',
'value3b2'
]
},
}
for line in recursive(example_dict):
print(line)
</code></pre>
<h3>结果:</h3>
<pre><code>key1 value1
key2 key2a value2a
key3 key3a key3aa value3aa
key3 key3a key3ab value3ab
key3 key3a key3ac value3ac
key3 key3b value3b1
key3 key3b value3b2
</code></pre>