(Извините, я действительно имел в виду это как комментарий к ответу Алекса Мартелли, так как мой основан на его; но когда я первоначально писал, у меня не было достаточно репутации, чтобы комментировать)
Ответ Алекса на самом деле не дает ожидаемого результата. Я не имею в виду более тонкие моменты наличия списка списков диктов или отсутствие запятых между списками (подробнее об этом позже). Но оригинальный вопрос хотел, в результате, собрать все медали по стране, по конкурсу . Алекс ответит:
> '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).