(申し訳ありませんが、これはAlex Martelliの回答に基づいているため、Alex Martelliの回答に対するコメントとして本当に意味していました;しかし、最初に投稿したとき、コメントするのに十分な評判がありませんでした)
アレックスの答えは、実際には意図した結果を生成しません。私は、辞書のリストのリストを持つことの細かい点や、リスト間のコンマの欠如を意味するものではありません (これについては後で詳しく説明します)。しかし、元の質問では、結果として、すべてのメダルを国別、競技会別に編集する必要がありました。アレックスのソリューションは次のように答えます。
> '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'}]
質問のデータは少しわかりにくいですが、2 つの可能性があります。
1) 表示されているデータは実際には3 つの異なる例であり、タスクは各リスト内の辞書エントリを個別にマージすることです。つまり、
[{'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) 2 番目の可能性は、問題のデータが 3 つのリストを含む 1 つの単一のリストであり、それぞれに dict が含まれていることです。これは元の質問の意味ではないと思いますが、そのためのコードを既に書いているので、ここにあります:)
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) を使用します。