列表组和按列的总和

时间:2011-06-07 07:51:34

标签: python list

我有以下

    (Decimal('1.000'), Decimal('419.760000'), Decimal('4.197600000'), Decimal('423.957600000'))             
(Decimal('1.000'), Decimal('62.370000'), Decimal('0.623700000'), Decimal('62.993700000'))           
(Decimal('2.000'), Decimal('7.920000'), Decimal('0.079200000'), Decimal('7.999200000'))

我想按第一列对它们进行分组并将其他列相加(按第一列分组的总和,分别对每列进行汇总)...但我不知道该怎么做...

我是python的新手...任何指针?

谢谢, BR

2 个答案:

答案 0 :(得分:3)

假设这三个元组是元组或列表numbers中的项:

column_sums = [sum(items) for items in zip(*numbers)]

重读你的问题,我想你可能会想要将除第一行中第一行之外的所有数字组合在一起,然后得到每组的总和。如果是这样,那就这样做:

from collections import defaultdict

grouped = defaultdict(list)

for tpl in numbers:
    grouped[tpl[0]].extend(tpl[1:])

group_sums = dict((key, sum(lst)) for key, lst in grouped.items())

如果您不需要itermediate grouped变量,可以像这样进行优化:

group_sums = defaultdict(int)

for tpl in numbers:
    group_sums[tpl[0]] += sum(tpl[1:])

回复:评论

如果您首先给出了您想要的输出示例,那将会非常容易。例如,您可以将此添加到帖子中:

  

从上面的例子我想要这个输出:

{Decimal('1.000'): [
   Decimal('482.130000'), Decimal('4.821300000'), Decimal('486.951300000')],
Decimal('2.000'): [
   Decimal('7.920000'), Decimal('0.079200000'), Decimal('7.999200000')]}

然后可以立即发布这个答案:

from itertools import izip_longest

group_sums = {}

for tpl in numbers:
    previous_sum = group_sums.get(tpl[0], [])
    iterator = izip_longest(previous_sum, tpl[1:], fillvalue=0)
    group_sums[tpl[0]] = [prev + num for prev, num in iterator]

如果列中的列数不同,这也适用。请告诉我这次我正确理解了这个问题。 :)

答案 1 :(得分:0)

如果给出以下输入:

inputData = [[1,2,3],
             [1,3,4],
             [5,6,7]]

并且您期望获得分组总和 - 例如前两个的总和(从第一个col分组1)和第三行本身的总和(因为在第一列中没有更多的行,其中有5个)然后您可以使用以下代码:

res = []
for i,val in enumerate(zip(*inputData )[0]):# first column
   filtered = filter(lambda x: x[0] == val, inputData)
   (not filtered in res and res.append(filtered))

print map(lambda comb: map(sum, zip(*comb)), res)