为什么以下列表理解在Python中不起作用?

时间:2017-05-09 08:24:59

标签: python list list-comprehension

我有一个名为row的列表:

row = ['1234', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]]

我想更改row[1],以便将少数数字替换为时间,其余数字替换为字符串'ABS'。像这样:

['1234', ['ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', '09:54:59', '09:55:18', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS']]

这是我的代码:

for obj in row_objs:
    row[1] = [str(obj.punch.time()) if x==obj.punch.day else 'ABS' for x in row[1]]

但我继续将所有数字替换为' ABS'用上面的代码。

当我这样做时:

for obj in row_objs:
    row[1] = [str(obj.punch.time()) if x==obj.punch.day else x for x in row[1]]

时间安排正确,但其他数字仍在那里。

['1234', [1, 2, 3, 4, 5, 6, 7, '09:54:59', '09:55:18', 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]]

这里出了什么问题?

2 个答案:

答案 0 :(得分:3)

每次迭代你都替换列表。 obj循环中的最后一个for与任何整数都不匹配,因此最终结果是您生成的列表仅包含'ABS'个字符串。您的第二个循环有效,因为您通过重新使用x来获取已经替换的值;可以是原始整数,也可以是后来的time()替换。

不要使用for循环。将所有obj.punch值收集到将day属性映射到str(...time())结果的字典中,然后使用列表推导来查找匹配项:

days = {obj.punch.day: str(obj.punch.time()) for obj in row_objs}
row[1] = [days.get(x, 'ABS') for x in row[1]]

现在您只需将row[1]替换一次。

答案 1 :(得分:0)

for obj in row_objs:
    row[1] = [str(obj.punch.time()) if x == obj.punch.day else isinstance(x, int) and 'ABS' or x for x in row[1]]