Потеря данных Повторный вызов метода - PullRequest
0 голосов
/ 15 февраля 2012

Я понимаю, что этот вопрос задавался и отвечался в прошлом, но у меня возникают проблемы с настройкой моего метода, чтобы избежать потери данных после повторных вызовов.

Мой метод:

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 голосов
/ 15 февраля 2012

Мне нужно посмотреть, как на самом деле реализовано ваше свойство 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]

Самый простой способ отладки - просто поместить операторы печати выше и ниже, показывающие длину самого объекта self.accounts.

Я все еще предлагаю не использовать del и рассмотретьметод list.pop вместо этого.И, что еще более важно, рассмотрите возможность переопределения вашего self.container в качестве словаря, поскольку способ «списков списков» для моделирования данных электронных таблиц не очень эффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...