
本文详解在 Python 中通过反转列表逐字符比对实现字符串后缀判断时,因误用 list.index() 方法导致索引错位(如 "sumo" 与 "omo" 测试失败)的根本原因,并提供安全、简洁、可读性强的修复方案。
本文详解在 python 中通过反转列表逐字符比对实现字符串后缀判断时,因误用 `list.index()` 方法导致索引错位(如 `"sumo"` 与 `"omo"` 测试失败)的根本原因,并提供安全、简洁、可读性强的修复方案。
在实现字符串后缀匹配(即判断 text 是否以 ending 结尾)时,一种常见思路是将两个字符串转为列表、反转后逐位比对。但若错误依赖 list.index() 获取当前元素位置,会引发严重逻辑缺陷——尤其当 ending 含重复字符时。
问题核心在于这行代码:
num = ending_list.index(i)
list.index(x) 总是返回 x 首次出现的索引。而你的 ending_list 已被反转(例如 "omo" → ['o', 'm', 'o']),当循环第二次遇到 'o'(即原字符串末尾的 'o')时,ending_list.index('o') 仍返回 0(第一个 'o' 的位置),而非当前迭代所需的索引 2。这导致你始终用 text_list[0] 与 ending_list[0] 比较,跳过了后续字符,造成误判。
✅ 正确做法:直接使用 range(len(...)) 遍历索引,确保每个位置一一对应:
def solution(text, ending):
text_list = list(text)
ending_list = list(ending)
text_list.reverse()
ending_list.reverse()
if len(text_list) <p>该版本逻辑清晰: </p>
- 先校验长度,避免越界;
- 用 i 作为统一索引,同步访问 text_list[i] 和 ending_list[i];
- 一旦发现不匹配立即返回 False,无需维护中间结果列表,空间与时间更优;
- 最终无差异则返回 True。
⚠️ 注意事项:
- list.index() 适用于查找特定值的位置,不适用于循环中按序获取当前迭代索引;
- 字符串本身支持切片操作,更简洁的解法是 return text.endswith(ending)(内置方法已高度优化);
- 若需手动实现,也可直接从末尾向前比对(无需反转),如 text[-len(ending):] == ending,语义更直观且避免额外内存开销。
综上,索引应由循环结构本身提供,而非依赖值查找。理解 index() 的行为边界,是写出健壮列表操作代码的关键一步。











