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。
我希望有一个简单的解决方案。我似乎无法理解为什么会发生这种情况。网上的一切都表明这不应该是我在 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。