如何解决用Python分组并汇总字典列表的值
您可以使用collections.Counter
和collections.defaultdict
。
使用dict可以在中完成O(N)
,而排序则需要O(NlogN)
时间。
from collections import defaultdict, Counter
def solve(dataset, group_by_key, sum_value_keys):
dic = defaultdict(Counter)
for item in dataset:
key = item[group_by_key]
vals = {k:item[k] for k in sum_value_keys}
dic[key].update(vals)
return dic
...
>>> d = solve(my_dataset, 'date', ['value1', 'value2'])
>>> d
defaultdict(<class 'collections.Counter'>,
{
datetime.date(2013, 1, 2): Counter({'value2': 10, 'value1': 10}),
datetime.date(2013, 1, 1): Counter({'value2': 20, 'value1': 20})
})
的优点Counter
是它将自动将相似键的值相加。
>>> c = Counter(**{'value1': 10, 'value2': 5})
>>> c.update({'value1': 7, 'value2': 3})
>>> c
Counter({'value1': 17, 'value2': 8})
解决方法
我试图以一种优雅的方式编写一个函数,该函数将字典列表进行分组并汇总(加和)like键的值。
例:
my_dataset = [
{
'date': datetime.date(2013,1,1),'id': 99,'value1': 10,'value2': 10
},{
'date': datetime.date(2013,'id': 98,2),'id' 99,'value2': 10
}
]
group_and_sum_dataset(my_dataset,'date',['value1','value2'])
"""
Should return:
[
{
'date': datetime.date(2013,'value1': 20,'value2': 20
},'value2': 10
}
]
"""
我尝试使用itertools为groupby进行此操作,并对每个相似键值对进行求和,但是这里缺少一些内容。这是我的函数当前的样子:
def group_and_sum_dataset(dataset,group_by_key,sum_value_keys):
keyfunc = operator.itemgetter(group_by_key)
dataset.sort(key=keyfunc)
new_dataset = []
for key,index in itertools.groupby(dataset,keyfunc):
d = {group_by_key: key}
d.update({k:sum([item[k] for item in index]) for k in sum_value_keys})
new_dataset.append(d)
return new_dataset
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。