2013-04-24 40 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

相关问题