我有一个包含两个整数字段的列表,我希望求和(字符串,整数,整数)
myList= [[["26-07-2017",2,0], ["26-07-2017",3,0], ["27-07-2017",1,0], ["27-07-2017",0,1]]]
现在我想按日期分组并对int字段求和。所以输出应该是这样的:
sumList= [[["26-07-2017",5,0], ["27-07-2017",1,1]]]
我怎样才能做到这一点?谢谢你的回答。
答案 0 :(得分:3)
您可以使用itertools.groupby
分组日期中的项目,然后使用reduce
对每个组中的数字进行求和:
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需要导入reduce
:from functools import reduce
你可以通过在for循环中获取总和来避免使用相对较少的直觉reduce
(也在提交给GvR):
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]]]
答案 1 :(得分:2)
你可以用Pandas
做到这一点import pandas as pd
df = pd.DataFrame(myList[0])
answer = df.groupby([0]).sum()
给了我
1 2
0
26-07-2017 5 0
27-07-2017 1 1
修改强>: 我按照上面的方式使用了您的列表,但经过一些修改后,代码更有意义:
# name the columns
df = pd.DataFrame(myList[0], columns=['date', 'int1', 'int2'])
# group on the date column
df.groupby(['date']).sum()
返回
int1 int2
date
26-07-2017 5 0
27-07-2017 1 1
,数据框如下:
date int1 int2
0 26-07-2017 2 0
1 26-07-2017 3 0
2 27-07-2017 1 0
3 27-07-2017 0 1
答案 2 :(得分:0)
我会使用字典跟踪第一个条目,如下所示:
my_dict = {}
for entry in myList:
if entry[0] not in my_dict:
#This makes my_dict hold dates as keys and a list of 2 integers as values
my_dict[entry[0]] = [entry[1:]]
else:
#In the case that the date is already in my_dict, add the new integers
my_dict[entry[0]][0] += entry[1]
my_dict[entry[0]][1] += entry[2]
#Now my_dict holds dates as keys with all the sums following
#If I really need it to be in the list format you asked for:
sumList = []
for value in my_dict:
sumList.append(value, my_dict[value][0], my_dict[value][1])
答案 3 :(得分:0)
您可以使用dict存储您的唯一日期和值的总和
代码:
myList= [[["26-07-2017",2,0], ["26-07-2017",3,0], ["27-07-2017",1,0], ["27-07-2017",0,1]]]
dic = {}
for x in myList[0]:
try:
dic[x[0]][0] = dic[x[0]][0]+x[1]
dic[x[0]][1] = dic[x[0]][1] + x[2]
except:
dic[x[0]] = [x[1], x[2]]
[[k,v[0], v[1]]for k,v in dic.items()]
输出:
[['26-07-2017', 5, 0], ['27-07-2017', 1, 1]]