You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:54:02