python 中的嵌套循环中的“break”跳过原始循环的下一次迭代

`break` in a nested loop in python skips the next iteration of the original loop

我希望有一个简单的解决方案。我似乎无法理解为什么会发生这种情况。网上的一切都表明这不应该是我在 Python 3.8.

中看到的行为

我正在 projecteuler.net 上 Problem 3。你必须找到一个巨大数字的质因数分解,然后将它们相乘。

我的想法是首先找到每个小于原始数一半的因子(不相关,但这在数学上可行并节省时间)。然后我会简单地遍历因子列表以删除任何不是质数的因子。

当我遇到任何非素数因子时,我使用 break 跳出嵌套循环,该循环检查并删除非素数因子,但随后它也会完全跳过检查下一个因子.本质上,它的行为类似于外循环中的 continue 语句。

我尝试了很多修改,包括 try 和 except,但没有什么能阻止 break 跳过下一个因素。

这是为调试目的而调用的带有额外打印函数的代码:

import math as m
def prime_factor(n):
    factors = []
    
    for i in range(1,m.ceil(n/2)):
        if n % i == 0:
            factors.append(i)
            
    print(factors)
    for num in factors:
        print('******', num, '******')
            for i in range(2, num):
                if num % i == 0:
                    print('NOT PRIME', num, 'NOT PRIME')
                    factors.remove(num)
                    break
    print(factors)
    return factors


prime_factors = prime_factor(100)
                

如果运行:

,下面是该代码的输出
[1, 2, 4, 5, 10, 20, 25]
****** 1 ******
****** 2 ******
****** 4 ******
NOT PRIME 4 NOT PRIME
****** 10 ******
NOT PRIME 10 NOT PRIME
****** 25 ******
NOT PRIME 25 NOT PRIME
[1, 2, 5, 20]

第一个列表是所有因素。然后,本来应该检查每个因素的,但是由于发现10不是因素,所以内循环被打破,然后在外循环中跳过20。

我真的希望有人觉得这个问题足够有趣来帮助我解决它,因为除了完全尝试完全不同的方法之外我不知所措。

感谢所有帮助。

您正在破坏性地修改您正在迭代的列表,这不是一个好主意。如果您使用本质上非破坏性的列表推导式进行重构,您将拥有更清晰的代码,问题就会消失。但是,要立即纠正问题,请将列表环绕在您的因素列表周围 - for num in list(factors):.

我可以看出问题出在您指定的删除函数上。
考虑这个

before remove: [1, 2, 4, 10, 20, 25] num : 4
after remove: [1, 2, 10, 20, 25] num : 4

您可以看到,在删除 4 之后,10 取其索引(在本例中为 2)值,因此对于下一次迭代,它变为 20 而不是 10。