I have a list with two integer fields which I would like to sum (string,integer, integer)
myList= [[["26-07-2017",2,0], ["26-07-2017",3,0], ["27-07-2017",1,0], ["27-07-2017",0,1]]]
Now I would like to group by date and sum the int fields. So the output should be like this:
sumList= [[["26-07-2017",5,0], ["27-07-2017",1,1]]]
How can I accomplish this? Thank you for the answer.
解决方案
You can use itertools.groupby to group the items on the date, then use reduce to sum numbers in each group:
from itertools import groupby
lst = [[k] + reduce(lambda x, y: [y[1]+x[1], y[2]+x[2]], g)
for k, g in groupby(myList[0], lambda x: x[0])]
print [lst]
# [[['26-07-2017', 5, 0], ['27-07-2017', 1, 1]]]
Python 3 requires importing reduce: from functools import reduce
You could avoid using the relatively less intuitve reduce (also in submission to GvR) by taking the sums in a for loop:
from itertools import groupby
lst = []
for k, g in groupby(myList[0], lambda x: x[0]):
g = [sum(d) for d in zip(*(t[1:] for t in g))]
lst.append([k] + g)
print [lst]
# [[['26-07-2017', 5, 0], ['27-07-2017', 1, 1]]]