我有以下
(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
答案 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)