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)