我试图用一种优雅的方式编写一个函数,它将一个字典列表分组,并聚合(求和)like键的值。
示例:
my_dataset = [
{
'date': datetime.date(2013, 1, 1),
'id': 99,
'value1': 10,
'value2': 10
},
{
'date': datetime.date(2013, 1, 1),
'id': 98,
'value1': 10,
'value2': 10
},
{
'date': datetime.date(2013, 1, 2),
'id' 99,
'value1': 10,
'value2': 10
}
]
group_and_sum_dataset(my_dataset, 'date', ['value1', 'value2'])
"""
Should return:
[
{
'date': datetime.date(2013, 1, 1),
'value1': 20,
'value2': 20
},
{
'date': datetime.date(2013, 1, 2),
'value1': 10,
'value2': 10
}
]
"""
我尝试过使用groupby的itertools并对每一个相似的键值对求和,但是这里缺少一些东西。以下是我的函数当前的外观:
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
这里有一种使用^{} 的方法,您只需关注如何构造输出。
给定
代码
输出
项目按日期分组,相关值减少为
Counters
。详细信息
步骤
kfunc
)vfunc
)rfunc
)。请参阅下面的等效rfunc
。简单分组
没问题。
定制输出
虽然得到的数据结构清晰、简洁地显示了结果,但是OP的预期输出可以重建为一个简单的dict列表:
有关
map_reduce
的更多信息,请参见the docs。通过> pip install more_itertools
安装。+等效的还原函数:
您可以使用
collections.Counter
和collections.defaultdict
。使用dict可以在
O(N)
中完成,而排序需要O(NlogN)
时间。Counter
的优点是它将自动对相似键的值求和示例:
谢谢,我忘了柜台。我仍然想维护返回数据集的输出格式和排序,所以下面是我的最终函数:
相关问题 更多 >
编程相关推荐