【问题标题】:restarting for cycle iterating over list python3重新启动以循环迭代列表 python3
【发布时间】:2018-12-28 22:13:13
【问题描述】:

[python] 3.6
您好,我正在尝试使用 for 循环遍历列表,只要确认条件,我就必须重新启动循环。 在 C 语言中我会这样做:
for(i = 0; i < 10; i++){ if(list[i] == something) i = 0; }

我在这里尝试这样做:

for x in listPrimes:
    if((num % x) == 0):
        num /= x # divide by the prime
        factorials.append(x)
        x = 2 # reset to the first prime in the list?

无法正常工作。有哪些方法可以将 for 重置为列表的某个迭代?我必须以其他方式做吗?
感谢您的宝贵时间

【问题讨论】:

标签: python python-3.x list for-loop


【解决方案1】:

while 循环是最优雅的解决方案。为了完整起见,您可以将 list 包装到自定义 generator 中,并让这个新的 iterable 接收信号以重置循环。

import time

def resetable_generator(li):
    while True:
        for item in li:
            reset = yield item
            if reset:
                break
        else:
            raise StopIteration


x = range(10)
sum = 0
r = resetable_generator(x)
for item in r:
    time.sleep(1)
    sum += item
    if item == 6:
        sum += r.send(True)
    print(sum)

【讨论】:

    【解决方案2】:

    使用itertools.takewhileutil

    这是一个人为的例子:

    import itertools
    
    li = [1,2,3,4,5]
    for i in range(1, 6):
            print(list(itertools.takewhile(lambda x: x!=i, li)))
            print("new cycle")
    

    输出:

    []
    new cycle
    [1]
    new cycle
    [1, 2]
    new cycle
    [1, 2, 3]
    new cycle
    [1, 2, 3, 4]
    new cycle
    

    【讨论】:

      【解决方案3】:

      你可以只使用一个while循环:

      i = 0
      while i < 10:
          print("do something", i)
          if random.random() < 0.2:
              print("reset")
              i = -1
          i += 1
      

      具体到您的示例:

      i = 0
      while i < len(listPrimes):
          x = listPrimes[i]
          if num % x == 0:
              num /= x
              factorials.append(x)
              i = -1
          i += 1
      

      【讨论】:

      • 好答案,只需将 if 中的 i = 0 更改为 i = -1,或者继续,因为 i 之后会增加。谢谢
      【解决方案4】:

      您可以使用类似于 C 代码的while 循环。

      while i < 10: if list[i] == something: i = 0 i += 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2020-01-25
        • 1970-01-01
        相关资源
        最近更新 更多