如何在内层for循环满足条件后执行5次再终止外层Python循环?
解决方案:满足条件后执行5次内层循环再终止外层循环
没问题,咱们来实现你想要的逻辑——当内层循环的条件满足后,再跑5次内层迭代,然后直接终止外层循环。我先从你的测试代码入手,再迁移到实际业务代码里。
一、测试代码的修改示例
首先先修正你测试代码的缩进问题(Python对缩进很敏感),然后添加状态变量来跟踪触发状态和额外执行次数:
triggered = False extra_iterations = 0 outer_break = False for x in range(100): print('inside 1st loop') for y in range(25,60): # 先判断是否已经完成了额外5次迭代 if extra_iterations >=5: outer_break = True break print('inside second loop') if y >= x: print ('y is now greater than x') triggered = True # 如果已经触发条件,开始计数额外迭代 if triggered: extra_iterations +=1 # 外层循环判断是否需要终止 if outer_break: break
逻辑说明:
triggered:标记是否已经遇到了满足y >=x的条件extra_iterations:记录触发后已经执行的额外内层循环次数outer_break:标记是否需要终止外层循环- 每次内层循环先检查是否已经完成5次额外迭代,如果是,就设置外层终止标志并跳出内层循环;外层循环每次结束后检查这个标志,决定是否终止。
二、业务代码的适配修改
针对你的DataFrame遍历场景,我们把同样的逻辑迁移过去,同时修正原代码里的缩进问题(比如a1.iat[i,65] = title_derived应该放在内层循环结束后,外层循环的每次迭代里):
import pandas as pd # 初始化状态变量 triggered = False extra_runs = 0 stop_outer = False for i in range(len(a1)): if stop_outer: break title_derived = [] print(i) for j in range(len(b1)): # 先检查是否已经完成5次额外执行 if extra_runs >=5: stop_outer = True break # 原业务逻辑 if b1.iloc[j][10] == a1.iloc[i][3]: print('1st if ' + str(j)) print(b1.iloc[j][1], a1.iloc[i][11], b1.iloc[j][5]) date_condition = (pd.to_datetime(b1.iloc[j][1]) <= pd.to_datetime(a1.iloc[i][11]) <= pd.to_datetime(b1.iloc[j][5])) or \ (pd.to_datetime(b1.iloc[j][1]) <= pd.to_datetime(a1.iloc[i][8]) <= pd.to_datetime(b1.iloc[j][5])) if date_condition: print('2nd if' + str(j)) title_derived.append(b1.iloc[j][15]) print('inserted ' + b1.iloc[j][15] + ' in ' + str(i) + ' th record ') # 触发条件满足,标记为True triggered = True # 如果已经触发,计数额外执行次数 if triggered: extra_runs +=1 # 给当前a1记录赋值 a1.iat[i,65] = title_derived
关键调整点:
- 把日期判断逻辑抽成
date_condition变量,让代码更清晰易读 - 当第二个if条件满足时,设置
triggered = True,开始计数额外迭代 - 每次内层循环开头先检查
extra_runs是否达到5,达到就设置stop_outer并跳出内层,外层循环根据这个标志终止 - 修正了
a1.iat[i,65] = title_derived的缩进,确保每次外层循环迭代后都能给当前行正确赋值
另外补充:如果你的“连续符合条件的记录”是指连续的j满足条件才触发计数,而不是只要触发过一次就开始计数,可以再告诉我,我再调整逻辑细节~
内容的提问来源于stack exchange,提问作者Sarang Manjrekar
相关产品推荐
相关产品推荐

