例如,如果我有结果
[{'Germany': {"Luge - Men's Singles": 'Gold'}},
{'Germany': {"Luge - Men's Singles": 'Silver'}},
{'Italy': {"Luge - Men's Singles": 'Bronze'}}]
[{'Germany': {"Luge - Women's Singles": 'Gold'}},
{'Austria': {"Luge - Women's Singles": 'Silver'}},
{'Germany': {"Luge - Women's Singles": 'Bronze'}}]
[{'Austria': {'Luge - Doubles': 'Gold'}},
{'Latvia': {'Luge - Doubles': 'Silver'}},
{'Germany': {'Luge - Doubles': 'Bronze'}}]
我如何对此进行排序,以便德国等所有赢得的比赛都可以归入一个单一的冠军头衔。 即德国将是德国:Luge - Men's Singles:Gold,Silver,Luge - 女子单打:金牌,铜牌,Luge - 双打:铜牌。
感谢您的帮助
编辑:这是python shell的直接复制和粘贴,现在有助于混淆:[{'Germany':{“Luge - Men's Singles”:'Gold'}},{'Germany':{“Luge - Men's Singles”:'Silver'}},{'Italy':{“Luge - 男子单打“:'铜牌'}}] [{'德国':{“Luge - 女子单打”:'Gold'}},{'奥地利':{“Luge - 女子单打”:'Silver'}},{'德国':{“Luge - 女子单打“:'青铜'}}] [{'奥地利':{'Luge - 双打':'黄金'}},{'拉脱维亚':{'Luge - 双打':'银'}},{'德国':{'Luge - 双打':'青铜'}}]
对不起这个网站的新手。它为每个不同的事件循环3次,我想知道我是否可以在最后一个循环之后合并它?
答案 0 :(得分:5)
import collections
merged_result = collections.defaultdict(list)
for L in listoflistsofdicts:
for d in L:
for k in d:
merged_result[k].append(d[k])
或者如果你只有一个dicts列表而不是dicts列表列表(很难说你的Q! - ),那么只需
for d in listofdicts:
for k in d:
merged_result[k].append(d[k])
循环的一部分。
如果你想要字符串而不是列表作为merged_result
的值,那么在上面的代码之后添加
for k in merged_result:
merged_result[k] = ', '.join(merged_result[k])
或等效地(但构建一个新的普通字典而不是defaultdict):
merged_result = dict((k, ', '.join(v)) for k, v in merged_result.iteritems())
(这假设Python 2. * - 在Python 3中,使用.items
而不是.iteritems
)。
编辑:查看示例代码,它看起来像是无效的语法列表(缺少逗号),所以我也展示了如何处理它。
答案 1 :(得分:1)
(对不起,我的确认为这是对Alex Martelli的答案的评论,因为我的答案基于他;但是当我最初发布时,我没有足够的声誉来发表评论)
Alex的答案实际上并没有产生预期的结果。我并不是指有一个dicts列表列表或者列表之间缺少逗号的更精细点(稍后将详细介绍)。但是,最初的问题需要按国家/地区竞赛汇编所有奖牌。 Alex的解决方案将回答:
> '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个列表,每个列表包含dicts。我认为这不是原始问题的意思,但是,既然我已经为此编写了代码,那么它就是:)
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)。