我有一个自己的班级列表:
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
答案 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)