Python循环未正确遍历:仅返回首个ID的近5天最大值问题
问题分析与修复方案
我一眼就发现问题所在了——你把first_value和fifth_value的初始化放在了ID循环的外面!
问题根源
当你处理第一个ID(比如A1)时,while循环会一直执行到first_value变成15、fifth_value变成19,此时循环条件first_value <=14不再满足,循环终止。而当后续的ID(比如A4、A9)进入循环时,这两个变量已经是15和19了,while循环直接跳过,自然不会输出任何结果。
修复后的代码
把窗口起始值的初始化移到每个ID的循环内部,这样每个ID处理时都会从第一天的窗口重新开始计算。另外,我们还要处理某个窗口内没有该ID数据的情况,避免max()函数因为空列表报错:
num_list = [('A1', 4, 'FF', 977.98), ('A4', 14, 'CC', 249.12), ('A1', 14, 'EE', 386.42), ('A9', 19, 'BB', 919.21), ('A4', 14, 'CC', 109.80)] # 获取所有独立ID ID = {item[0] for item in num_list} # 日期上限是19,所以窗口的结束日期最大到18(对应起始14),窗口起始从1到14 for id in ID: # 每个ID处理前,重置窗口起始值 first_value = 1 fifth_value = 5 while first_value <= 14 and fifth_value <= 18: # 筛选当前窗口内该ID的所有事件 filtered = [item for item in num_list if item[0] == id and first_value <= item[1] <= fifth_value] if filtered: # 如果有数据才计算最大值 max_item = max(filtered, key=lambda x: x[3]) # 输出的Day是窗口的结束日期+1(因为题目说第6天考虑1-5天,所以窗口结束是5对应Day6) print(f"{fifth_value + 1} {max_item[0]} {max_item[3]}") # 窗口滑动一天 first_value += 1 fifth_value += 1
补充说明
- 按照题目要求,输出的
Day应该是窗口结束日期+1(比如窗口是1-5天,对应Day6),所以代码里用fifth_value +1作为输出的Day值。 - 加入了
if filtered:的判断,避免某个窗口内没有该ID数据时触发max()的空列表错误。 - 用集合推导式
{item[0] for item in num_list}获取所有独立ID,比手动收集更可靠。
运行这段代码后,就能遍历所有ID并输出每个窗口的最大数值啦!
内容的提问来源于stack exchange,提问作者R_J
相关产品推荐
相关产品推荐

