首页 > 解决方案 > python中嵌套循环中的`break`跳过原始循环的下一次迭代

问题描述

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

我正在 projecteuler.net 上解决问题 3。您必须找到一个巨大数字的素数分解,并将它们相乘。

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

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

我尝试了很多修改,包括尝试和例外,但没有什么能阻止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。

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

感谢您的任何帮助。

标签: python-3.xnested-loopsbreak

解决方案


我可以看到问题是您指定的删除功能。
考虑这个

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

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


推荐阅读