Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按数组对象键对数组对象求和_Python_Arrays_List_Csv_Sum - Fatal编程技术网

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

Python 按数组对象键对数组对象求和,python,arrays,list,csv,sum,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

我有自己班级的名单:

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文件包含关键的“OSCI”。我需要数组中每个元素的“odmcas”和“odmnj”之和,这些元素具有相同的“osci”,并且只创建一条记录

按以下方式打印阵列时的输出:

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

python脚本的输出应该是(通过“oscis”键将“odmcas”和“odmnj”相加):

我将基于元素的
.oscis
属性来使用它,然后对每个组求和两个必需的属性

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

tempsorted = sorted(temp, key=lambda x: x.oscis)
如果数组已排序,则不需要上述内容,您可以直接使用
temp
而不是下面的
tempsorded
-

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)

输出不应该是
30310 01082015 13 50.5 20.5 13
?此外,是否已使用oscis对列表进行排序?是的,您是对的。输出应为3031 0 01082015 13 50.5 20.5 13,是的,输入CSV文件已按oscis排序,因此数组也将按oscis排序。其他属性如何?它们是常量,如临时附加(…)中所示,不应求和。如果“OSCI”相同,则只应将“odmcas”和“odmnj”相加。非常感谢。你今天教了我新东西。工作完全符合我的需要。很高兴我能帮上忙。
tempsorted = sorted(temp, key=lambda x: x.oscis)
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)