python: заменить datetime.date на isoformat () в списке - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу заменить объекты даты и времени в этом списке:

a = [
  [datetime.date(2019,1,1), 100],
  [datetime.date(2019,1,2), 187],
]

Итак, я создал эту функцию:

def date_to_iso(rows):

    for line in rows:
        for item in line:
            if isinstance(item, datetime.date):
                item = item.date().isoformat()
    return tempL

Может кто-нибудь сказать мне, почему эта функция не изменяетсписок

1 Ответ

0 голосов
/ 13 февраля 2019

когда вы присваиваете обратно item, вы просто повторно используете имя item, но старая ссылка «потеряна».Вместо этого назначьте исходный список с индексом (используя идиоматический метод с enumerate, чтобы получить индекс и элемент:

def date_to_iso(rows):
    for line in rows:
        for i,item in enumerate(line):
            if isinstance(item, datetime.date):
                line[i] = item.date().isoformat()

, этот код использует item только для чтения, пока не потребуетсязамените его в исходном списке.

Обратите внимание, что line[i] = ... по-прежнему использует оригинальный объект line, поэтому он работает.

Другим способом было бы использование списка для полной перестройки.данные, которые потребовали бы назначения среза для rows[:] для имитации изменения на месте для rows:

def date_to_iso(rows):
    rows[:] = [[item.date().isoformat() if isinstance(item, datetime.date)
                else item for item in line] for line in rows]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...