python:在列表中用isoformat()替换datetime.date

时间:2019-02-13 19:37:20

标签: python list

我要替换此列表中的datetime对象:

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 :(得分:0)

当您分配回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]