丢失数据重复呼叫到方法

时间:2012-02-15 16:23:16

标签: python function

我意识到这个问题在过去已被提及并得到解答,但我在调整方法时遇到了问题,以避免在重复呼叫后丢失数据。

我的方法:

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

定义

我要做的是通过传递一个字符串来匹配其中一个标题名称来压缩字典中的帐户和值。该方法在标题中查找索引,然后尝试提取值列并删除标题。

对此方法的每次后续调用都会导致每个调用的字典长度减少1。当我传入'VALUE1'时,长度为26.当我传递'VALUE2'时,它的长度为25,依此类推。

任何人都可以建议一种方法来实现这一点,而不会丢失后续调用该方法的数据吗?

1 个答案:

答案 0 :(得分: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作为字典,因为“列表列表”建模电子表格数据的方式并不是那么有效。