总和列出直到元素更改,然后再次开始

时间:2013-05-29 23:33:03

标签: python list sum

如果在一个元素的名称中有一个chnage,是否有某种方式迭代列表并对列进行求和。

[['a','1'],['a','2'],['a','3']....on and on, ['b','1'],['b','2'],['b','3']...
on and on....]]

因此,当[a]处有'a'时,对索引1列求和,然后如果[0]改变(即'b'),则再次开始求和。所以我猜它可能是一种while循环,但是无法弄明白。我在思考(但显然是错误的)......

    for row in list:
        for i in row:  #iterate through each row
            var = i[0] #assign first index to 'var'
            while True: #while var is one name
                for num in lst:
                    sum(float(num[1]) for num in lst if num[1])   #add column [1]
            ....then something else...

一些事情 - 我不想指定元素名称('a','b'..)因为它会改变。 元素类型的数量也可能会发生变化 - 有时只是'a','b',有时是'c','d','e'等等 每次第一个元素发生变化时,我都需要以某种方式存储求和值

这可能不使用dict或模块等吗?

3 个答案:

答案 0 :(得分:2)

使用itertools.groupby()对商品进行分组:

from itertools import groupby
from operator import itemgetter

sums = [(key, sum(float(i[1]) for i in group))
        for key, group in groupby(row, key=itemgetter(0))]

这会生成('a', 10.0)等值的列表。

groupby()工具将您的输入序列拆分为组,其中下一组由key可调用确定;当key可调用返回的值更改时,将生成一个新组。

答案 1 :(得分:1)

这是itertools.groupby()的完美用例,它允许您对一个可迭代的元素进行分组。它可能看起来像这样:

from itertools import groupby
from operator import itemgetter
data = [['a','1'],['a','2'],['a','3'], ['b','1'],['b','2'],['b','3'],['b','4']]
sums = [(k, sum(float(v) for k, v in g)) for k, g in groupby(data, key=itemgetter(0))]

结果:

>>> sums
[('a', 6.0), ('b', 10.0)]

答案 2 :(得分:1)

在这种情况下,由于您要添加内容,因此可以使用计数器

>>> from collections import Counter
>>> L = [['a', '1'], ['a', '2'], ['a', '3'], ['b', '1'], ['b', '2'], ['b', '3']]
>>> c = Counter()
>>> for i,j in L:
...  c.update({i: float(j)})
... 
>>> c
Counter({'a': 6.0, 'b': 6.0})