对于列表列表,是否有某种方法可以为列表中的每个特定元素求和一列(使用python)。一个例子......
l=[['A1','1','2'],['A1','1','2'],['A1','3','3'],['B1','1','2'],['B1','5','5'],[...]]
现在将A1,B1等的第一列加起来并得到所需的输出...
sumA1=5
sumB1=6
sumC1.......
现在列表值可能会改变,所以我不想引用“A1,B1 ..”。它可能变成A3,B4 ......所以最好的方法是根据索引[0]求和(列的数量/类型不会改变)。 我有的代码只是一个简单的列表理解,无论是A1,B1等,都将第1列的所有内容相加。
for i in l:
total = sum(float(i[1]) for i in l if i[1])
考虑到每个“A1,B1 ..”总是会有相同数量的项目,让我们说10,另一种方法是在i [1]中每10个数字相加,但是我需要能够说'前10个数字的总和是A1,第2个10的数字的总和是B2,等等'。感谢帮助
答案 0 :(得分:3)
将第一列的项目分组为字典; defaultdict
使{}更容易:
from collections import defaultdict
sums = defaultdict(int)
for tup in l:
sums[tup[0]] += int(tup[1])
如果没有密钥, defaultdict
只会调用传入的工厂生成默认值(在这种情况下为int
,生成0
):
>>> d = defaultdict(int)
>>> d['foo']
0
演示:
>>> l=[['A1','1','2'],['A1','1','2'],['A1','3','3'],['B1','1','2'],['B1','5','5']]
>>> from collections import defaultdict
>>> sums = defaultdict(int)
>>> for tup in l:
... sums[tup[0]] += int(tup[1])
...
>>> sums
defaultdict(<class 'int'>, {'B1': 6, 'A1': 5})
然后打印总和就像:
for key in sorted(sums):
print 'sum{}={}'.format(key, sums[key])
如果输入列表已排序,请使用itertools.groupby()
:
from itertools import groupby
from operator import itemgetter
sums = {key: sum(int(t[1]) for t in group) for key, group in groupby(l, key=itemgetter(0))}
演示:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> {key: sum(int(t[1]) for t in group) for key, group in groupby(l, key=itemgetter(0))}
{'B1': 6, 'A1': 5}
事实上,通过排序列表和groupby
,您可以直接切换到打印:
for key, group in groupby(l, key=itemgetter(0)):
print 'sum{}={}'.format(key, sum(t[1]) for t in group))
没有外部模块,我只需要一本字典;这将比上述任何一个选项都慢:
sums = {}
for tup in l:
sums[tup[0]] = sums.get(tup[0], 0) + int(tup[1])
或者,对于已排序的变体:
sum, last = 0, l[0][0]
for tup in l:
key = tup[0]
if last != key and sum:
print 'sum{}={}'.format(last, sum)
sum, last = 0, key
sum += int(tup[1])
if sum:
print 'sum{}={}'.format(key, sum)
答案 1 :(得分:0)
>>> from collections import defaultdict
>>> a = [["a",1,2],["a",2,3],["b",45,2]]
>>> my_dict = defaultdict(list)
>>> for itm in a:
... my_dict[itm[0]].append(itm)
...
>>> for k,v in my_dict.items():
... print "Sum %s:%s"%(k,sum(zip(*v)[1]))
...
Sum a:3
Sum b:45