<p>(抱歉,我的本意是评论亚历克斯·马尔泰利的答案,因为我的答案是基于他的;但当我最初发帖时,我没有足够的声誉来评论)</p>
<p>亚历克斯的回答实际上并没有产生预期的结果。我不是说有一个dicts列表的更好的地方,或者列表之间没有逗号(稍后将详细介绍)。但最初的问题是,结果是,按国家、通过比赛收集所有奖牌。亚历克斯的解决方案将回答:</p>
<pre><code>> 'Germany': [{"Luge - Men's Singles": 'Gold'},
{"Luge - Men's Singles": 'Silver'},
{"Luge - Women's Singles": 'Gold'},
{"Luge - Women's Singles": 'Bronze'},
{'Luge - Doubles': 'Bronze'}]
</code></pre>
<p>但我相信最初的问题是:</p>
^{pr2}$
<p>问题中的数据有点令人困惑,我认为有两种可能:</p>
<p>1)显示的数据实际上是三个不同的示例,任务是分别合并每个列表中的dict条目。也就是说,给定</p>
<pre><code>[{'Germany': {"Luge - Men's Singles": 'Gold'}},
{'Germany': {"Luge - Men's Singles": 'Silver'}},
{'Italy': {"Luge - Men's Singles": 'Bronze'}}]
</code></pre>
<p>你想要吗</p>
<pre><code>['Germany': {"Luge - Men's Singles": ['Gold', 'Silver'],
"Luge - Women's Singles": ['Gold', 'Bronze']},
'Italy': {"Luge - Men's Singles": ['Bronze']}]
</code></pre>
<p>,给定</p>
<pre><code>[{'Germany': {"Luge - Women's Singles": 'Gold'}},
{'Austria': {"Luge - Women's Singles": 'Silver'}},
{'Germany': {"Luge - Women's Singles": 'Bronze'}}]
</code></pre>
<p>你想要吗</p>
<pre><code>['Germany': {"Luge - Women's Singles": ['Gold', 'Bronze']},
'Austria': {"Luge - Women's Singles": ['Silver']}]
</code></pre>
<p>等等。我想这是对这个问题最有可能的解释。在</p>
<p>以下代码可以做到这一点:</p>
<pre><code>from collections import defaultdict
merged = defaultdict(lambda: defaultdict(list))
for d in list_of_dicts:
for k in d:
for competition, medal in d[k].iteritems():
merged[k][competition].append(medal)
</code></pre>
<p>对上面显示的第一个列表运行此命令,您将得到</p>
<pre><code>defaultdict(<function <lambda> at 0x1907db0>,
{'Italy': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Bronze']}),
'Germany': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Gold', 'Silver']})})
</code></pre>
<p>2)第二种可能性是问题中的数据是一个单独的列表,包含3个列表,每个列表都包含dicts。我想这不是最初的问题的意思,但是,既然我已经为此编写了代码,那么这里就是:)</p>
<pre><code>from collections import defaultdict
merged = defaultdict(lambda: defaultdict(list))
for L in listoflistsofdicts:
for d in L:
for k in d:
for competition, medal in d[k].iteritems():
merged[k][competition].append(medal)
</code></pre>
<p>对问题上显示的列表运行上面的代码(加上必要的逗号,您将得到:</p>
<pre><code> defaultdict(<function <lambda> at 0x1904b70>,
{'Italy': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Bronze']}),
'Austria': defaultdict(<type 'list'>, {'Luge - Doubles': ['Gold'],
"Luge - Women's Singles": ['Silver']}),
'Latvia': defaultdict(<type 'list'>, {'Luge - Doubles': ['Silver']}),
'Germany': defaultdict(<type 'list'>, {'Luge - Doubles': ['Bronze'],
"Luge - Men's Singles": ['Gold', 'Silver'],
"Luge - Women's Singles": ['Gold', 'Bronze']})
})
</code></pre>
<p>请注意,这两种代码都不会对奖牌类型进行分类(例如,您可能会得到['Gold'、'Silver']或['Silver'、'Gold'])。在</p>
<p>当然,如果您得到了解决方案1)中使用的单独列表,但需要将所有列表合并,只需将它们全部合并到一个列表中,然后使用解决方案2)。在</p>