2017-02-22 7 views
0

У меня есть структура данных в таком виде:Сгруппированные сумма в вложен словаре Python

{ 
     "600": { 
       "comment": 9, 
       "like": 27, 
       "unlike": 3, 
       "photo_view": 267, 
       "post_engagement": 3291, 
       "page_engagement": 3318, 
       "post_reaction": 3003, 
       "post": 12 
      }, 
     "607": { 
       "comment": 3, 
       "like": 45, 
       "photo_view": 264, 
       "post_engagement": 3861, 
       "page_engagement": 3906, 
       "link_click": 6, 
       "post_reaction": 3579, 
       "post": 9 
      } 
     } 

Там может быть любое количество элементов в Словаре на верхнем уровне. Я хочу привести как:

{ 
"comment": 12 #9 + 3, 
"like": 72 #45 + 27 
....... 

} 

ПРИМЕЧАНИЕ: Некоторые элементы могут пропустить один или несколько ключей, как comment может отсутствовать во втором элементе. Как я могу это сделать, используя идиоматический питон.

ответ

2

Вы можете конвертировать вложенные dicts в Counter объектов и использовать sum, чтобы добавить их вместе:

from collections import Counter 

d = { 
    "600": { 
     "comment": 9, 
     "like": 27 
    }, 
    "607": { 
     "comment": 3, 
     "like": 45 
    }, 
    "608": { 
     "like": 1 
    } 
} 

print(sum((Counter(v) for v in d.values()), Counter())) 

Выход:

Counter({'like': 73, 'comment': 12}) 

Если вы хотите результат как dict вместо Counter вы можете конвертировать результат до dict:

print(dict(sum((Counter(v) for v in d.values()), Counter()))) 

Выход:

{'comment': 12, 'like': 73} 
+0

Большое спасибо за вас отличное решение! – anekix

1

Попробуйте это,

myVal={'607': {'comment': 3, 'page_engagement': 3906, 'like': 45, 'link_click': 6, 'post_reaction': 3579, 'post': 9, 'photo_view': 264, 'post_engagement': 3861}, '600': {'comment': 9, 'page_engagement': 3318, 'like': 27, 'unlike': 3, 'post_reaction': 3003, 'post': 12, 'photo_view': 267, 'post_engagement': 3291}} 
res={} 
for l in [val for key,val in myVal.iteritems()]: 
    for d,c in l.iteritems(): 
     res[d]=c if d not in res.keys() else res[d]+c 

print res 
#{'comment': 12, 'like': 72, 'unlike': 3, 'photo_view': 531, 'post_engagement': 7152, 'page_engagement': 7224, 'link_click': 6, 'post_reaction': 6582, 'post': 21} 
#Time for execution 0.000068105091 

Усин # г Счетчик:

print(sum((Counter(v) for v in myVal.values()), Counter())) 
#Time for execution 0.00473729887596 
+0

Большое спасибо за помощь – anekix

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

  • Нет связанных вопросов^_^