为了账号安全,请及时绑定邮箱和手机立即绑定

列表中每个元素的列表中的总和列

列表中每个元素的列表中的总和列

慕侠2389804 2021-03-07 18:19:20
对于列表列表,有一些方法可以为列表中的每个特定元素添加一列(使用python)。一个例子...l=[['A1','1','2'],['A1','1','2'],['A1','3','3'],['B1','1','2'],['B1','5','5'],[...]]现在仅将A1,B1等的第一列求和,并获得所需的输出为...sumA1=5sumB1=6sumC1.......现在列表值可能会更改,所以我不想引用“ A1,B1 ..”。它可能变成A3,B4...。所以最好的方法是根据index [0]求和(列的数量/类型不会改变)。我拥有的atm代码只是一个简单的列表解析,无论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,前10个数字的和是B2,依此类推。感谢帮助
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

将第一列上的项目分组到字典中;一个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)


查看完整回答
反对 回复 2021-03-26
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-03-26
  • 2 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信