【问题标题】:How to change index of a for loop?如何更改for循环的索引?
【发布时间】:2013-01-24 23:33:52
【问题描述】:

假设我有一个 for 循环:

for i in range(1,10):
    if i is 5:
        i = 7

如果满足特定条件,我想更改i。我试过这个但没有用。 我该怎么办?

【问题讨论】:

  • 使用while循环,而不是is使用==
  • 我正在编写类似于汇编代码解释器的东西。因此,由于我的实现,我必须跳转到某些说明。
  • 有一些方法可以使用字典来做得更好。
  • 尝试修改enumerate的索引时也可能出现这种情况。在这种情况下,只需切换到手动索引即可。

标签: python for-loop


【解决方案1】:

对于您的特定示例,这将起作用:

for i in range(1, 10):
    if i in (5, 6):
        continue

但是,使用while 循环可能会更好:

i = 1
while i < 10:
    if i == 5:
        i = 7
    # other code
    i += 1

for 循环在每次迭代开始时将变量(在本例中为 i)分配给列表/可迭代中的下一个元素。这意味着无论你在循环中做什么,i 都将成为下一个元素。 while 循环没有这样的限制。

【讨论】:

  • 这是唯一的方法吗?感觉有点乱。
  • @drum:想要从循环内部手动更改循环索引感觉很混乱。
  • 至少有了while,我们不会把它误认为是一个“常规”循环,它在它承诺的迭代范围内进行迭代。
  • @BrenBarn 有时混乱是唯一的方法
  • @BrenBarn,在其他语言中很常见;但是,是的,我因此遇到了很多错误
【解决方案2】:

这个概念在 C 世界中并不罕见,但应尽可能避免。 尽管如此,这就是我实现它的方式,我觉得很清楚正在发生什么。然后,您可以将向前跳过的逻辑放在循环内的任何位置的索引中,读者会知道要注意跳过变量,而在较深的地方嵌入 i=7 很容易被忽略:

skip = 0
for i in range(1,10):
   if skip:
      skip -= 1
      continue

   if i=5:
      skip = 2

   <other stuff>

【讨论】:

  • 虽然跳过是一种选择,但它绝对不是这个问题的合适答案。根据问题,一个人也应该能够在一个循环中来回走动。接受的答案用一个while循环解决了这个问题。
【解决方案3】:

关于为什么问题中的循环不能按预期工作的更多背景信息。

一个循环

for i in iterable: 
    # some code with i

基本上

的简写
iterator = iter(iterable)
while True:
    try:
        i = next(iterator)            
    except StopIteration:
        break
    # some code with i

因此,for 循环从一个由可迭代对象构造的迭代器中提取值,并自动识别该迭代器何时耗尽并停止。

如您所见,在while 循环的每次迭代中,i 被重新分配,因此无论您在# some code with i 中发出任何其他重新分配,i 的值都将被覆盖部分。

出于这个原因,Python 中的for 循环不适合对循环变量进行永久性更改,您应该改用while 循环,正如 Volatility 的回答中已经证明的那样。

【讨论】:

  • 很棒的细节。为了帮助初学者,不要将the value of i will be overridden regardlessoverriding the iterable 混淆。如果您的 # some code with i 更改了可迭代对象,它将产生影响。
【解决方案4】:

简单的想法是 i 在每次迭代后取一个值,而不管它在循环内分配给什么,因为循环在迭代结束时递增迭代变量,并且由于 i 的值是在循环内声明的,所以它被简单地覆盖。您可能想将 i 分配给另一个变量并对其进行更改。例如,

for i in range(1,10):
    if i == 5:
        u = 7

然后你可以在循环中使用'break'来中断循环,以防止进一步的迭代,因为它满足了所需的条件。

【讨论】:

    【解决方案5】:

    正如timgeb 解释的那样,您使用的索引每次都在for循环开始时被分配一个新值,我发现工作的方式是使用另一个索引。

    例如,这是您的原始代码:

    for i in range(1,10):
        if i is 5:
            i = 7
    

    你可以改用这个:

    i = 1
    j = i
    for i in range(1,10):
        i = j
        j += 1
        if i == 5:
            j = 7
    

    此外,如果您在 for 循环中修改列表中的元素,则可能还需要在每个循环结束时将范围更新为 range(len(list)) 如果您在其中添加或删除了元素。我这样做的方式是,分配另一个索引来跟踪它。

    list1 = [5,10,15,20,25,30,35,40,45,50]
    
    i = 0
    j = i
    k = range(len(list1))
    for i in k:
        i = j
        j += 1
        if i == 5:
            j = 7
        if list1[i] == 20:
            list1.append(int(100))
        # suppose you remove or add some elements in the list at here, 
        # so now the length of the list has changed
        
        k = range(len(list1))
        # we use the range function to update the length of the list again at here
        # and save it in the variable k
    

    但是,使用 while 循环来代替会更方便。 无论如何,我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 2020-12-11
      • 2020-08-07
      • 1970-01-01
      • 2021-09-08
      • 2011-02-19
      • 1970-01-01
      • 2012-09-27
      相关资源
      最近更新 更多