Python使用enumerate写for循环报String Index Out Of Range错误及优化求解
问题解答
报错原因
你之前代码触发String Index Out Of Range的核心问题是:判断逻辑里的y!=y[index-1]写法错误。这里的y是循环取出的单个字母字符串(比如'A',长度仅为1),并不是完整的Letter列。当index≥2时,你尝试对长度为1的字符串取下标index-1,自然会触发索引越界。正确的判断应该是对比当前字母和Letter列的前一个值:y != Letter[index-1]。
优化实现方案
方案1:单循环实现(轻量场景首选)
仅需一轮遍历即可完成计算,无需提前生成标记列表,逻辑清晰易维护,时间复杂度为O(n):
import pandas as pd d = {'Letters':['A','A','A','B','B','B'], 'Numbers':[1,2,3,4,5,6]} df = pd.DataFrame(data=d) number_output = [] prev_letter = None prev_output = None for letter, num in zip(df['Letters'], df['Numbers']): if letter != prev_letter: # 新字母分组首行计算逻辑 current = num / 0.5 else: # 同分组后续行计算逻辑 current = prev_output * 0.5 + num number_output.append(current) # 更新前序状态 prev_letter = letter prev_output = current df['NumberOutput'] = number_output
方案2:Pandas向量化实现(大数据量场景首选)
利用pandas分组能力实现,无需处理索引逻辑,在数据量较大时性能远高于纯Python循环:
import pandas as pd d = {'Letters':['A','A','A','B','B','B'], 'Numbers':[1,2,3,4,5,6]} df = pd.DataFrame(data=d) def calc_group(num_series): res = [] prev = None for num in num_series: current = num / 0.5 if prev is None else prev * 0.5 + num res.append(current) prev = current return res df['NumberOutput'] = df.groupby('Letters')['Numbers'].transform(calc_group)
两种方案最终得到的输出结果均为[2.0, 3.0, 4.5, 8.0, 9.0, 10.5],符合你描述的计算规则。
内容的提问来源于stack exchange,提问作者Gl0bus
相关产品推荐
相关产品推荐

