代码之家  ›  专栏  ›  技术社区  ›  Miguel

重新启动以循环迭代列表python3

  •  2
  • Miguel  · 技术社区  · 8 年前

    [蟒蛇]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?
    

    它不能正常工作。如何将重置为列表的某个迭代?我必须用其他方式来做吗?
    谢谢你抽出时间

    4 回复  |  直到 8 年前
        1
  •  3
  •   phngs    8 年前

    您可以使用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
    
        2
  •  1
  •   Josh Herzberg    8 年前

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

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

        3
  •  0
  •   dgumo    8 年前

    使用 itertools.takewhile 乌蒂尔

    下面是一个人为的例子:

    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
    
        4
  •  0
  •   Petr Javorik yours friendly    8 年前

    这个 while 循环是最优雅的解决方案。为了完整起见,您可以将 列表 定制 发电机 让这个新的 可迭代的 接收信号以重置回路。

    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)