2015-09-03 38 views
2

我有我自己的類的列表:求和陣列對象由數組對象鍵

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文件,將數據追加到我的課叫做行的列表:

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

不應輸出是'3031 0 01082015 13 50.5 20.5 13'?另外,列表是否已經使用'oscis'排序? –

+0

是的,你說得對。輸出應該是3031 0 01082015 13 50.5 20.5 13,是的,輸入的CSV文件已經被oscis排序,因此數組也會被排序。 – Bugscz

+0

其他屬性呢? –

回答

2

我會根據元素的.oscis屬性使用itertools.groupby()屬性d然後爲每個組求和兩個必需的屬性。

請注意,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) 
+0

非常感謝。你今天教我新東西。完全按照我的需要工作。 – Bugscz

+0

很高興我能幫到你。 –