<p>循环浏览列表并处理每个字典,将每个条目添加到输出中的适当位置,必要时创建新的字典和列表。你知道吗</p>
<pre><code>d = [
{"state": "California", "county": "Monterey", "city": "Salinas"},
{"state": "California", "county": "Monterey", "city": "Gonzales"},
{"state": "Oregon", "county": "Douglas", "city": "Roseburg"},
{"state": "Oregon", "county": "Douglas", "city": "Winston"},
{"state": "California", "county": "Alameda", "city": "Berkeley"},
]
output = {}
for place in d:
if place['state'] not in output:
output[place['state']] = {}
if place['county'] not in output[place['state']]:
output[place['state']][place['county']] = []
output[place['state']][place['county']].append(place['city'])
</code></pre>
<p>结果:</p>
<pre><code>>>> import pprint
>>> pprint.pprint(output, width=30)
{'California': {'Alameda': ['Berkeley'],
'Monterey': ['Salinas',
'Gonzales']},
'Oregon': {'Douglas': ['Roseburg',
'Winston']}}
</code></pre>
<p>或者,用<code>collections.defaultdict</code>:</p>
<pre><code>from collections import defaultdict as dd
output = dd(lambda: dd(list))
for place in d:
output[place['state']][place['county']].append(place['city'])
</code></pre>
<p>结果是:</p>
<pre><code>>>> pprint.pprint(output)
defaultdict(<function <lambda> at 0x000000E254B53E18>,
{'California': defaultdict(<class 'list'>,
{'Alameda': ['Berkeley'],
'Monterey': ['Salinas', 'Gonzales']}),
'Oregon': defaultdict(<class 'list'>,
{'Douglas': ['Roseburg', 'Winston']})})
</code></pre>