本文详解如何安全遍历列表中间索引(排除首尾),准确识别满足“大于前后相邻元素”条件的峰值元素(即“hunch”),并避免因切片与enumerate索引错位导致的逻辑错误。
本文详解如何安全遍历列表中间索引(排除首尾),准确识别满足“大于前后相邻元素”条件的峰值元素(即“hunch”),并避免因切片与enumerate索引错位导致的逻辑错误。
在处理序列分析类问题(如识别局部峰值)时,初学者常误用 enumerate(data_list[1:-2]) 这类切片+枚举组合——看似简洁,实则埋下严重隐患:enumerate 返回的索引 i 始终从 0 开始计数,而 data_list[1:-2] 是一个新子列表,其第 0 个元素对应原列表的索引 1;但你在循环体内仍用 data_list[i] 访问,这实际访问的是原列表索引 0 处的值,完全偏离目标位置。
✅ 正确做法是直接控制原始索引范围:对索引 i 遍历 range(1, len(data_list) - 1),确保 i 始终指向原列表中合法的“中间位置”(即既有前驱 i-1,又有后继 i+1)。判断条件可简洁写为 data_list[i-1] data_list[i+1](Python支持链式比较,语义清晰且高效)。
以下是完整、可运行的解决方案:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
tokens = input().split()
data_list = [int(token) for token in tokens] # 更Pythonic的列表推导式替代循环append
print(f'Sequence: {data_list}')
# 遍历所有可能的"中间"索引:从1到倒数第二个元素(含)
for i in range(1, len(data_list) - 1):
if data_list[i-1] data_list[i+1]:
# 直接复用原始tokens字符串,避免类型转换,保证输出格式一致
print(f"Hunch: {' '.join(tokens[i-1:i+2])}")
⚠️ 注意事项:
- 切勿对切片列表使用 enumerate 后直接套用原列表索引——这是本题最典型的逻辑陷阱;
- range(1, len(data_list) - 1) 的上界是 len(data_list) - 1(不包含),因此 i 最大为 len(data_list) - 2,此时 i+1 恰好是最后一个有效索引;
- 使用 tokens[i-1:i+2] 提取原始输入字符串片段,既避免重复转整型再转字符串,又严格保持输入空格分隔格式(如输入 "12 14 72 52",输出 "14 72 52" 而非 "14 72 52 ");
- 若输入少于3个元素(如 [5] 或 [3, 8]),range(1, len(...) - 1) 自动为空,循环不执行,符合题意(无中间位置可判断)。
掌握索引边界意识与原生数据结构的合理复用,是写出健壮循环逻辑的关键第一步。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










