(对不起,我的意思是对 Alex Martelli 的回答的评论,因为我的答案是基于他的;但是当我最初发布时,我没有足够的声誉来发表评论)
亚历克斯的回答实际上并没有产生预期的结果。我并不是指拥有 dicts 列表的更好点,或者列表之间没有逗号(稍后会详细介绍)。但是,最初的问题因此需要按国家、按比赛汇总所有奖牌。亚历克斯的解决方案将回答:
> 'Germany': [{"Luge - Men's Singles": 'Gold'},
{"Luge - Men's Singles": 'Silver'},
{"Luge - Women's Singles": 'Gold'},
{"Luge - Women's Singles": 'Bronze'},
{'Luge - Doubles': 'Bronze'}]
但我相信最初的问题实际上是要求:
> 'Germany': [{"Luge - Men's Singles": ['Gold', 'Silver']},
{"Luge - Women's Singles": ['Gold', 'Bronze'},
{'Luge - Doubles': 'Bronze'}]
问题中的数据有点混乱,我看到了两种可能性:
1)显示的数据实际上是三个不同的示例,任务是分别合并每个列表中的dict条目。也就是说,给定
[{'Germany': {"Luge - Men's Singles": 'Gold'}},
{'Germany': {"Luge - Men's Singles": 'Silver'}},
{'Italy': {"Luge - Men's Singles": 'Bronze'}}]
你要
['Germany': {"Luge - Men's Singles": ['Gold', 'Silver'],
"Luge - Women's Singles": ['Gold', 'Bronze']},
'Italy': {"Luge - Men's Singles": ['Bronze']}]
, 给定
[{'Germany': {"Luge - Women's Singles": 'Gold'}},
{'Austria': {"Luge - Women's Singles": 'Silver'}},
{'Germany': {"Luge - Women's Singles": 'Bronze'}}]
你要
['Germany': {"Luge - Women's Singles": ['Gold', 'Bronze']},
'Austria': {"Luge - Women's Singles": ['Silver']}]
等等。我认为这是对这个问题最有可能的解释。
以下代码执行此操作:
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)
对上面显示的第一个列表运行它,你会得到
defaultdict(<function <lambda> at 0x1907db0>,
{'Italy': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Bronze']}),
'Germany': defaultdict(<type 'list'>, {"Luge - Men's Singles": ['Gold', 'Silver']})})
2)第二种可能性是问题中的数据是一个列表,包含3个列表,每个列表都包含字典。我认为这不是原始问题的意思,但是,因为我已经为此编写了代码,所以这里是:)
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)
为问题中显示的列表运行上面的代码(添加了必要的逗号,您会得到:
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']})
})
请注意,这两个代码都不会对奖牌类型进行排序(即,您最终可能会得到 ['Gold', 'Silver'] 或 ['Silver', 'Gold'])。
当然,如果您得到解决方案 1) 中使用的单独列表,但需要将所有列表合并,只需将它们全部放在一个列表中,然后使用解决方案 2)。