2013-04-24 39 views
0

考慮到有多個字典的列表,共享相同的密鑰。帶字典的列表 - 所有密鑰的計數值(Python)

data = [{'count': 3, 'os': 'Windows'}, 
     {'count': 2, 'os': 'Windows'}, 
     {'count': 5, 'os': 'Linux'}, 
     {'count': 1, 'os': 'Linux'}] 

如何總結它們的值?預計:

data = [{'count': 5, 'os': 'Windows'},{'count': 6, 'os': 'Linux'}] 
+0

數據是否始終採用相同的格式?如果是這樣的話,你可以考慮將它保存爲元組形式:''data = [('Windows',3),('Linux',2),..] – 2013-04-24 09:21:07

回答

5
import itertools 

data = [ 
    {'count': 3, 'os': 'Windows'}, 
    {'count': 2, 'os': 'Windows'}, 
    {'count': 5, 'os': 'Linux'}, 
    {'count': 1, 'os': 'Linux'} 
] 

results = [] 
for key, val in itertools.groupby(data, lambda v: v['os']): 
    count = sum(item['count'] for item in val) 
    results.append({'count' : count, 'os' : key}) 

>>> results 
>>> [{'count': 5, 'os': 'Windows'}, {'count': 6, 'os': 'Linux'}] 
+0

+1提'groupby' – 2013-04-24 08:54:39

+0

簡單而直截了當!乾杯。 – norus 2013-04-24 08:54:49

+0

謝謝。 Itertools有一些非常宏偉的功能和類。 – 2013-04-24 08:55:32

1
from collections import defaultdict 

sum_dict = defaultdict(int) 

for d in dicts: # your dictionaries 
    for key, value in d.iteritems(): 
     sum_dict[key] += value 

爲了確保您可以將其壓縮成單的工作,但不可讀性的單行。此外,類Counter可能在這裏很有用。 collectionsitertools包含大量的非常有用的東西

+0

+1提及計數器。 – 2013-04-24 08:55:16

+0

-0.1因爲不使用它:) – 2013-04-24 08:56:09

+0

哈哈,真的。但是,如果OP考慮改變他的數據格式,它可能是有用的。 – 2013-04-24 09:19:39

相關問題