2015-08-05 3 views
0

У меня есть вложенное словарь под названием «high_low_teams_in_profile», который выглядит следующим образом:Python: Суммируя значения вложенных в различных словарей в гнездовой словаре

{ 
    m_profile1: 
     { 
      team_size1: 
       { 
        low: 1, 

        high: 1 

       }, 
      team_size2: 
       { 
        low: 1, 

        high: 1 

       } 
     }, 
    m_profile2: 
     { 
      team_size1: 
       { 
        low: 1, 

        high: 1 

       }, 
      team_size2: 
       { 
        low: 1, 

        high: 1 

       } 

     } 
} 

И я хочу, чтобы получить {m_profile1: 4, m_profile2: 4}

Что является самым красноречивым способом сделать это в python? Прямо сейчас у меня есть следующий:

new_num_teams_in_profile = {} 
for profile in high_low_teams_in_profile: 
    new_num_teams_in_profile[profile]= dict((team_size, sum(high_low_teams_in_profile[profile][team_size].values())) for team_size in high_low_teams_in_profile[profile]) 

new_num_teams_in_profile= dict((profile, sum(new_num_teams_in_profile[profile].values())) for profile in new_num_teams_in_profile) 

ответ

2

Я не уверен если я бы сказал, что это самый Pythonic, а это самый functional:

p = high_low_teams_in_profile 
{ prof:sum(p[prof][team][hl] 
      for team in p[prof] 
      for hl in p[prof][team]) 
    for prof in p} 

Аргументы sum является generator expression и внешняя { prof:sum(...) for prof in p} является dictionary comprehension.

+0

О, хорошо! Мне нравится этот =) аккуратный и лаконичный! – doubleOK

0

Хотя это может быть не самым вещим, следующий код должен работать и более удобная для чтения, чем ваша версия. Обратите внимание на метод iteritems(), который позволяет получить доступ к ключам и значениям dict, а itervalues(), как следует из названия, только итерации значений dict.

final = {} 
for key, sizes in high_low_teams_in_profile.iteritems(): 
    total = 0 
    for value in sizes.itervalues(): 
     s = sum(value.itervalues()) 
     total += s 

    final[key] = total 

print final 

Кроме того, вы можете использовать следующее. Хотя это более короткое количество строк, читать их немного сложнее.

final = {} 
for key, sizes in high_low_teams_in_profile.iteritems(): 
    total = sum([sum(value.itervalues()) for value in sizes.itervalues()]) 
    final[key] = total 

print final 
Смежные вопросы