Python循环中如何仅打印条件成立时每段匹配结果的首末值
解决方案
实现逻辑
你只需要新增两个变量记录连续区间的状态即可,逻辑非常简单:
- 用
in_valid_period标记当前是否处于连续满足eph < 0的区间 - 用
last_record存储上一个符合条件的时间和eph值,方便退出区间时打印末尾值
修改后的完整代码
from astropy.time import Time import swisseph as swe from datetime import timedelta as td, datetime swe.set_ephe_path('G:\Ephemeris') swe.set_jpl_file('de440.eph') start_date = '2021-01-01 00:00:00' end_date = '2021-12-31 00:00:00' d1 = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S') d2 = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S') def get_delta(d1, d2): delta = d2 - d1 return delta delta = get_delta(d1,d2) # 新增两个状态变量 in_valid_period = False last_record = None for i in range(delta.days * 1 + 1): x = d1 + td(days=i) jd = Time(x).jd eph = swe.calc_ut(jd, 2, swe.FLG_SPEED+swe.FLG_JPLEPH)[0][3] if eph < 0: if not in_valid_period: # 刚进入符合条件的区间,打印第一个值 print(x, eph) in_valid_period = True # 不管是不是刚进入,都更新最新的符合条件记录 last_record = (x, eph) else: if in_valid_period: # 刚退出符合条件的区间,打印上一个记录的末尾值 print(last_record[0], last_record[1]) in_valid_period = False # 遍历结束后检查,如果最后一天还在符合条件的区间里,补打末尾值 if in_valid_period and last_record: print(last_record[0], last_record[1])
效果说明
修改后输出就会严格按照你要求的格式,每段连续符合eph < 0的区间只会输出首尾两个值,不会打印中间内容。如果存在长度仅为1天的符合条件区间,代码会打印两次相同的当日值,你可以根据实际需求自行增加去重判断,常规的行星逆行场景不会出现这类极端情况,当前代码可直接使用。
内容的提问来源于stack exchange,提问作者Butterfly Fiziks
相关产品推荐
相关产品推荐

