Python两列表相邻元素差值计算及索引越界问题解决
问题背景
存在两个等长列表,分别存储事件的起始帧(START)与结束帧(END),示例数据如下:
START END 111 113 118 133 145 186
已知约束:START列表的后一个元素始终大于END列表的前一个元素(例如示例中118 > 113)。
需求为逐组计算START列表下一个元素与对应位置END列表上一个元素的差值(例如示例中118-113、145-133),最终统计所有差值的平均值。
现有代码错误原因
当前实现代码如下:
def estimateAverageBlinkInterval(blinkStartFrame, blinkStopFrame): estimateAverage = [] for i in range(0, len(blinkStartFrame)): print(blinkStartFrame) for j in range(0, len(blinkStopFrame)): print(blinkStopFrame[j]) estimateAverage.append(blinkStartFrame[i+1]-blinkStopFrame[j]) return mean(estimateAverage)
触发索引越界、结果错误的核心原因有两个:
- 索引范围设置错误:循环
i的遍历范围是0到len(blinkStartFrame)-1,当i取到列表最后一个索引时,i+1等于列表长度,超出列表有效索引范围(列表最大有效索引为长度-1),直接触发IndexError: list index out of range。 - 冗余双层循环:计算逻辑不需要双层遍历两个列表,待求差值是索引一一对应的相邻组:即第
i个结束帧,对应第i+1个起始帧,双层循环会生成大量无效差值,完全偏离计算需求。
之前尝试blinkStartFrame[:-1]切片未生效,是因为没有同步对齐END列表的遍历范围,索引没有一一匹配。
修正实现
方案1:直观循环写法
逻辑最容易理解,直接把循环上限设为列表长度-1,保证i+1不会越界,每次取对应位置的值计算即可:
from statistics import mean def estimateAverageBlinkInterval(blinkStartFrame, blinkStopFrame): intervals = [] # 遍历到倒数第二个索引即可,i+1最大为列表最后一个索引 for i in range(len(blinkStartFrame) - 1): intervals.append(blinkStartFrame[i+1] - blinkStopFrame[i]) return mean(intervals)
用示例数据验证:
- 输入
blinkStartFrame = [111, 118, 145],blinkStopFrame = [113, 133, 186] - 计算得到差值:
118-113=5、145-133=12 - 返回平均值为
(5+12)/2 = 8.5,符合预期。
方案2:zip精简写法
通过切片错位对齐两个列表,用zip直接配对需要计算的数值对,不需要手动管理索引,从根源避免索引越界:
from statistics import mean def estimateAverageBlinkInterval(blinkStartFrame, blinkStopFrame): # blinkStartFrame[1:]:从第二个元素开始的所有起始帧 # blinkStopFrame[:-1]:从第一个到倒数第二个的所有结束帧 intervals = [curr_start - prev_end for curr_start, prev_end in zip(blinkStartFrame[1:], blinkStopFrame[:-1])] return mean(intervals)
两种写法逻辑完全一致,可根据自己的编码习惯选择。
内容的提问来源于stack exchange,提问作者Stefani Dimitrova
相关产品推荐
相关产品推荐

