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

在遍历列表时直接使用 `i+1` 访问后继元素会导致“indexerror: list index out of range”,因为当 `i` 为最后一个索引时,`i+1` 超出合法范围;正确做法是在访问前显式检查 `i+1

当你需要在循环中比较当前元素与下一个元素(例如统计相邻的 1 对、计算差分、滑动窗口逻辑等),常见的错误是无条件使用 arr[i+1],而未考虑数组边界。在你的代码中:

for i in range(C):
    if cInt1[i] == 1:
        counter += 3
        if cInt1[i+1] == 1:  # ❌ 危险!当 i == C-1 时,i+1 == C → 越界
            counter -= 1

此时若 i = C-1(即遍历到最后一个索引),cInt1[i+1] 将尝试访问第 C 个元素(索引从 0 开始,合法范围是 0 到 C-1),必然触发 IndexError。

✅ 正确解法:前置边界检查
将 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

⚠️ 额外注意:你代码中还存在一处逻辑冗余——第三个循环:

for i in range(0, C, 2):
    if cInt2[i] == 1 and cInt2[i] == 1:  # ❌ 恒为真(同一变量重复判断),且未用到 i+1
        counter -= 1

该条件等价于 cInt2[i] == 1,且循环步长为 2,与前后逻辑不一致,建议根据实际需求重审逻辑(例如是否应为 cInt2[i] == 1 and cInt2[i+1] == 1?若如此,仍需加 i+1

? 更优雅的替代方案(进阶推荐):
若目标是遍历所有相邻元素对(即 (0,1), (1,2), ..., (n-2,n-1)),更清晰的方式是直接控制 range 上限:

for i in range(len(cInt1) - 1):  # i 最大为 len-2,i+1 最大为 len-1 → 安全
    if cInt1[i] == 1:
        counter += 3
        if cInt1[i+1] == 1:
            counter -= 1

这种方式从源头规

避越界,语义更明确,也无需每次重复写 i+1

✅ 总结:

  • 根本原因:i+1 超出列表长度;
  • 通用修复:访问前加 i + 1
  • 最佳实践:若仅需处理相邻对,用 range(len(lst)-1) 替代 range(len(lst));
  • 调试提示:遇到 IndexError,优先检查所有带 +k 或 -k 的索引表达式是否越界。

修复后,输入示例将正确输出 9。