在循环浏览列表时编辑列表是否安全?

时间:2016-07-19 15:04:43

标签: python arrays python-2.7 python-3.x for-loop

我试图执行for循环,如:

a = [1,2,3,4,5,6,7]
for i in range(0, len(a), 1):
    if a[i] == 4:
        a.remove(a[i])

我最终得到index error,因为列表的length变得更短但迭代器i没有意识到。

所以,我的问题是,这样的东西怎么编码?可以根据当前数组条件在循环的每次迭代中更新range i吗?

3 个答案:

答案 0 :(得分:2)

对于您提到的.pop(),您可以使用列表推导来创建第二个列表,甚至可以修改原始列表。像这样:

alist = [1, 2, 3, 4, 1, 2, 3, 5, 5, 4, 2]

alist = [x for x in alist if x != 4]
print(alist)
#[1, 2, 3, 1, 2, 3, 5, 5, 2]

正如 user2393256 更常见的那样,您可以概括和定义一个函数my_filter(),该函数将根据您在其中实现的某些检查返回boolean。然后你就可以做到:

def my_filter(a_value):
    return True if a_value != 4 else False

alist = [x for x in alist if my_filter(x)]

如果检查太复杂而无法输入列表解析,我会使用函数解决方案,因此主要是为了便于阅读。因此上面的例子不是最好的,因为支票很简单,但我只是想告诉你如何做。

答案 1 :(得分:1)

如果要在迭代时删除列表中的元素,则应使用列表推导。

a = [1,2,3,4,5,6,7]
a = [x for x in a if not check(x)]

您需要编写一个“检查”函数,无论您是否要将元素保留在列表中,都需要返回。

答案 2 :(得分:0)

我不知道你要去哪里,但这会做我想要你想要的东西:

i=0
a = [1,2,3,4,5,6,7]
while boolean_should_i_stop_the_loop :
   if i>=len(a) :
      boolean_should_i_stop_the_loop = False
   #here goes what you want to do in the for loop
   print i;
   a.append(4)
   i += 1