0

一旦一个元素的名称发生变化,是否有某种方法迭代列表并对列求和。

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

因此,当 [0] 处有 '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'等而且我需要在每次第一个元素改变时以某种方式存储总和值

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

4

3 回答 3

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可调用的返回值发生变化时,就会产生一个新的组。

于 2013-05-29T23:35:59.497 回答
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)]
于 2013-05-29T23:37:00.677 回答
1

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

>>> 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})
于 2013-05-29T23:41:41.497 回答