按数组对象键对数组对象求和

时间:2015-09-03 04:58:13

标签: python arrays list csv sum

我有一个自己的班级列表:

class Line:
    def __init__(self, oscis, cicin, zapl, odmdr, odmcas, odmnj, odmzak):
        self.oscis = oscis
        self.cicin = cicin
        self.zapl = zapl
        self.odmdr = odmdr
        self.odmcas = odmcas
        self.odmnj = odmnj
        self.odmzak = odmzak 

我的代码读取CSV文件并将数据附加到我的类列表中,名为Line:

temp = []
r = open(input_file, "r")
try:
    reader = csv.reader(r, delimiter = ";")
    for row in reader:
        temp.append(Line(row[0], "0", "01082015", "13", float(row[1].replace(",", ".").replace(" ", "")), float(row[2].replace(",", ".").replace(" ", "")), "13"))
finally:
    r.close()    

到目前为止工作如此之好。我已经用CSV文件中的值填充了列表。

CSV文件包含“oscis”,这是关键。我需要对具有相同“oscis”的数组的每个元素求和“odmcas”和“odmnj”,并且只创建一个记录。

我打印数组时的输出:

for l in temp:
    print(l.oscis, l.cicin, l.zapl, l.odmdr, l.odmcas, l.odmnj, l.odmzak)

是:

3031 0 01082015 13 25.0 10.0 13
3031 0 01082015 13 25.0 10.0 13
3031 0 01082015 13 0.5 0.5 13

python脚本的输出应该是(用“oscis”键加上“odmcas”和“odmnj”):

3031 0 01082015 13 50.5 20.5 13

1 个答案:

答案 0 :(得分:2)

我会根据元素的.oscis属性使用itertools.groupby(),然后为每个组求和两个必需的属性。

请注意,itertools.groupby要求列表已根据您要分组的key进行排序,因此如果列表尚未排序,则应将其排序为 -

tempsorted = sorted(temp, key=lambda x: x.oscis)

如果数组已经排序,则不需要上面的内容,您可以直接使用temp代替tempsorted -

import itertools
for k, grp in itertools.groupby(tempsorted, key=lambda x: x.oscis):
    summedodmcas = 0
    summedodmnj = 0
    for li in grp:
        summedodmcas += li.odmcas
        summedodmnj += li.odmnj
    print(li.oscis, li.cicin, li.zapl, li.odmdr, summedodmcas, summedodmnj, li.odmzak)