【问题标题】:Is it safe practice to edit a list while looping through it?在循环浏览列表时编辑列表是否安全?
【发布时间】:2016-11-22 13:36:46
【问题描述】:

我试图执行一个 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 没有意识到。

所以,我的问题是,如何编码这样的东西? irange 是否可以根据当前数组条件在循环的每次迭代中更新?

【问题讨论】:

  • 如果长度不断变化,循环将非常不可预测。它会停在哪里?
  • 您为什么要这样做?如果在 range 函数中动态计算长度,您将陷入无限循环。
  • 即使你的这个循环确实有效,它也会永远运行。
  • @syam 这是一个糟糕的设计模式。您的数据结构应保持不变,以便对代码进行正确性检查。
  • 我建议编辑你的问题,告诉我们你想要的代码行为。

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


【解决方案1】:

例如,对于您提到的.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)]

如果检查太复杂而无法输入列表理解,我会使用函数解决方案,主要是为了可读性。因此,上面的示例不是最好的,因为检查非常简单,但我只是想向您展示如何完成。

【讨论】:

  • 有人应该编辑原始问题以反映它真正要求的内容。现在,除非有人阅读评论,否则这似乎是一个完全错误的答案。
  • @Jim 我不知道可以在多大程度上修改一个问题,但我很确定我把它拉长了。让我们看看..
  • 好的,我在做了一些改进后接受了编辑。如果有人认为这是一个延伸,可以进行回滚。
【解决方案2】:

如果您想在迭代列表时从列表中删除元素,您应该使用列表推导。

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

您需要编写一个“检查”函数来返回您是否希望将元素保留在列表中。

【讨论】:

  • 谢谢,已更改。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 2016-08-08
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2010-12-01
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多