我的计划是删除0到1000之间少于两位数的所有数字。 我这样做:
Async
当我检查我的阵列时,它仍然包含这些数字" 1,3,5,7,9和#34;。 那是为什么?
答案 0 :(得分:2)
在迭代它时,不应更改列表或其他类型的容器。这是发生的那种错误。有关详细信息,请参阅here。
更准确地说,当您从列表中删除当前或更早的元素时,您将其向“左”移动。由于循环最有可能转换为经典for
循环,因此您最终会跳过向左移动的元素。
答案 1 :(得分:2)
迭代器不知道对基础列表的更改。它只返回下一个可用的数字,这意味着在删除0之后,迭代器当前指向1,因此产生2作为要检查的下一个值。简短的回答是:不要修改你正在迭代的列表。
而是创建一个包含您想要保持的值的新列表:
numbers = range(0, 1001)
new_numbers = []
for number in numbers:
if len(str(number)) >= 2:
new_numbers.append(number)
numbers = new_numbers
更简单地说,使用列表理解:
numbers = [x for x in numbers if len(str(x)) >= 2]
答案 2 :(得分:1)
我看到两个可能的问题。首先,它是一个范围,而不是一个实际的数组。其次,在迭代它时修改列表是个坏主意。 Confider使用列表推导。
mapred job -logs job_1503124774831_0022 attempt_1503124774831_0022_m_000000_0
答案 3 :(得分:0)
for循环只生成一个索引来迭代列表。您正在修改循环内的列表,因此它不会给出正确的结果。
假设你有一个列表len = 10
numbers = [0,1,2,3,4,5,6,7,8,9]
然后你运行这个循环
for number in numbers:
if number < 2:
numbers.remove(number)
在第一次迭代中,索引将为0,数字将为[0,1,2,3,4,5,6,7,8,9],它将删除数字[0] = 0
在第二次迭代中,索引将为1,数字列表将为[1,2,3,4,5,6,7,8,9],因为我们删除了最后一个循环中的第一个元素,它现在将删除数字[1] = 2
等等。
做你想做的最好的方法是使用列表兼容:
numbers = [x for x in numbers if len(str(number)) > 2]