0

对于列表列表,是否有某种方法可以为列表中的每个特定元素求和一列(使用 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....所以最好的方法是根据 index[0] 求和(列的数量/类型不会改变)。我有 atm 的代码只是一个简单的列表理解,它总结了所有第 1 列,无论 A1、B1 等是否。

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,以此类推。感谢帮助

4

2 回答 2

3

将第一列上的项目分组到字典中;adefaultdict使这更容易一些:

from collections import defaultdict

sums = defaultdict(int)

for tup in l:
    sums[tup[0]] += int(tup[1])

defaultdict如果键不存在,只需调用传入的工厂生成默认值(int在这种情况下,生成 a 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)
于 2013-05-25T00:02:46.683 回答
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
于 2013-05-25T00:09:58.063 回答