如何安全地在循环中访问列表的下一个元素以避免索引越界错误

在遍历列表时直接使用 `i+1` 访问后续元素易导致 `indexerror: list index out of range`,根本原因是未校验索引是否超出列表边界。正确做法是在访问前显式判断 `i + 1

当你需要在循环中比较当前元素与下一个元素(例如统计相邻配对、计算差分、实现滑动逻辑)时,一个常见误区是假设 i+1 总是有效索引。但当 i 达到 len(list) - 1(即最后一个有效下标)时,i+1 就等于 len(list),已超出合法范围(Python 列表索引为 0 到 len(list)-1),从而触发运行时错误。

在你提供的代码中,问题集中在以下两处:

if cInt1[i+1] == 1:  # 当 i == C-1 时,i+1 == C → 越界!
    counter -= 1

if cInt2[i+1] == 1:  # 同样,i == C-1 时越界
    counter -= 1

正确修复方式:始终前置边界检查
将 cInt1[i+1] == 1 改为 i + 1

修正后的核心循环如下:

for i in range(C):
    if cInt1[i] == 1:
        counter += 3
        if i + 1 < len(cInt1) and cInt1[i+1] == 1:  # ✅ 安全访问
            counter -= 1
        else:
            print("hi")

for i in range(C):
    if cInt2[i] == 1:
        counter += 3
        if i + 1 < len(cInt2) and cInt2[i+1] == 1:  # 

✅ 安全访问 counter -= 1 # 注意:第三个循环存在逻辑冗余(cInt2[i] == 1 and cInt2[i] == 1 等价于单个判断) # 且步长为2,仍需检查 i+1 是否越界(若用于相邻判断),但当前写法无越界风险(仅用 cInt2[i])

⚠️ 额外建议与注意事项

  • 更优雅的遍历方式:若目标是处理所有相邻对 (cInt1[i], cInt1[i+1]),推荐使用 range(len(cInt1) - 1) 替代 range(C),从源头排除越界可能:
    for i in range(len(cInt1) - 1):
        if cInt1[i] == 1:
            counter += 3
            if cInt1[i+1] == 1:
                counter -= 1
  • 避免硬编码 C:C 是输入长度,但列表实际长度由 input().split() 决定。应统一使用 len(cInt1) 和 len(cInt2),增强鲁棒性。
  • 调试技巧:遇到越界错误,可临时添加 print(f"i={i}, len={len(cInt1)}") 快速定位临界点。

通过前置索引校验或调整遍历范围,即可彻底解决“Index out of range”问题,让代码既健壮又可读。