Python列表组和更多字段的总和

时间:2017-06-28 12:30:26

标签: python list

我有一个包含两个整数字段的列表,我希望求和(字符串,整数,整数)

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]]]

我怎样才能做到这一点?谢谢你的回答。

4 个答案:

答案 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需要导入reducefrom 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]]