2017-05-09 73 views
1

我有一个名为row列表:为什么下面的列表理解不能在Python中工作?

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

我可能没有足够的咖啡,但这里并不存在'row [1]'被'for'循环的每次迭代覆盖的问题,这样OP只会看到最后一个效果迭代? – timgeb

+0

@timgeb这似乎是问题所在。他们刚刚更新了他们的问题。 –

+0

@timgeb:以前评论过的那些'for'循环不在那里。他们期待每个“迭代”不会影响下一次迭代。 –

回答

3

你是替换列表每次迭代。 for循环中的最后一个obj与任何整数都不匹配,因此最终结果是您生成的列表仅包含'ABS'字符串。您的第二个循环可以工作,因为您可以重新使用x;即可以是原始整数,或者后面的time()替代。

请勿使用for循环。收集在一本字典的day属性映射到str(...time())结果所有obj.punch值,然后使用列表理解查找匹配:

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]一次。

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]] 
+1

虽然这段代码可能会回答这个问题,但提供关于为什么和/或代码如何回答这个问题的附加上下文会提高它的长期价值。 –

相关问题