2012-02-15 91 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