如何在Python中更改for循环的索引?

时间:2013-02-09 06:09:10

标签: python for-loop

假设我有一个for循环:

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

如果符合某些条件,我想更改i。我尝试了这个,但没有奏效。 我该怎么做呢?

5 个答案:

答案 0 :(得分:62)

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

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)分配给list / iterable中的下一个元素。这意味着无论你在循环中做什么,i都将成为下一个元素。 while循环没有这样的限制。

答案 1 :(得分:13)

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

循环

match-data

基本上

的简写
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部分。

由于这个原因,Python中的# some code with i循环不适合循环变量的永久性更改,你应该使用for循环,这已经在Volatility中得到证明了。答案。

答案 2 :(得分:2)

这个概念在C世界并不罕见,但如果可能应该避免。 尽管如此,这是我实施它的方式,我觉得很清楚发生了什么。然后你可以把你的逻辑用于在循环内的任何地方的索引中向前跳过,并且读者将知道要注意跳过变量,而在某个深处嵌入i = 7很容易被遗漏:

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

   if i=5:
      skip = 2

   <other stuff>

答案 3 :(得分:0)

一个简单的想法是,无论循环内部分配了什么值,i都会在每次迭代后获取一个值,因为循环在迭代结束时会增加迭代变量,并且由于i的值是在循环内部声明的,因此只是被覆盖。您可能想要将我分配给另一个变量并对其进行更改。例如,

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

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

答案 4 :(得分:0)

正如 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 循环还是会更方便。 无论如何,我希望这会有所帮助。