2012-02-15 52 views
0

我意識到這個問題已被問及過去的答案,但我無法調整我的方法,以避免重複調用後數據丟失。丟失數據重複調用方法

我的方法:

def getColumn(self, name): 
    index_num = self.headers.index(str(name)) 
    columns = [item[index_num] for item in self.container] 
    acco = self.accounts 
    del acco[0] 
    del columns[0] 
    columns = [item.replace(',', '') for item in columns] 
    return dict(zip(acco, columns)) 

self.container是與具有以下形式的標題的數組:

[['ACCOUNT', 'VALUE1', 'VALUE2'], 
['Account1', '3.43', '2.5'], 
['Account2', '1,235.67', '8.98']] 

self.accounts由return [item[0] for item in self.container

我」定義什麼m試圖做的是通過傳遞一個字符串來匹配其中一個頭名稱來壓縮字典中的帳號和值。該方法查找標題中的索引,然後嘗試拉出值列並刪除標題。

對該方法的每次後續調用都會導致每次調用的字典長度減1。當我傳入'VALUE1'時,長度爲26.當我通過'VALUE2'時,其長度爲25,依此類推。

任何人都可以提出一種方法來實現這一點,而不會丟失後續調用該方法的數據?

+0

如果您通過'VALUE1','VALUE2'和'VALUE1',會發生什麼情況? – 2012-02-15 16:30:35

+0

有很多方法可以做到這一點 - 例如,保留一個狀態變量(例如self.next),表示要獲取的下一個變量的索引。然而,這看起來像一個非常糟糕的階級設計 - 你確定沒有更好的方式來安排事情嗎? – 2012-02-15 16:33:29

+0

它繼續失去價值。再次通過'VALUE1'後長度減少到24. – donopj2 2012-02-15 16:34:21

回答

0

我需要看看你的self.accounts屬性是如何實際實現的,但我幾乎可以肯定你的問題在於你使用內建的del。有很少的原因,特別是在這樣簡單的情況下,使用del,特別是在可變類型(即列表)時,它會導致一些非常奇怪的行爲。我猜測,你的問題就出在這兩條線:

acco = self.accounts 
del acco[0] 

哪些是有效地這樣做:

del self.accounts[0] 

您可能會發現此修復它:

acco = self.accounts[:] # makes a shallow copy of self.accounts 
del acco[0] 

最簡單的調試的方法是簡單地將print語句放在上面和下面,以顯示self.accounts對象本身的長度。

我仍然建議不要使用del並考慮使用list.pop方法。而且,更重要的是,考慮將self.container重新實現爲字典,因爲建立電子表格數據的「列表清單」方式並不那麼高效。

+0

這樣做。欣賞建議。 – donopj2 2012-02-15 17:00:27