删除空格后判断字符串是否为回文的Python代码报索引错误求排查
问题分析与修复方案
核心错误点
split()方法误用:你想用这个方法处理空格,但split()是按空格把字符串分割成单词列表。比如输入"kayak"时,new_string.split()得到的是["kayak"](仅1个元素),但你用len(new_string)拿到的是字符串长度5,后续访问newstringseperated[n-1-i]时,索引远超列表长度,直接触发索引错误。要逐个字符处理,应该直接用字符串索引(字符串本身支持按索引访问),或者转成字符列表list(new_string)。- 变量未初始化:
hello和hello2只有在字符不匹配时才会被赋值,若所有字符都匹配,这两个变量根本没定义,后续判断会抛出NameError。 - 循环范围错误:偶数长度字符串的循环范围
range(n//2 -1)会少循环一次,比如"deed"长度为4,n//2 -1等于1,只循环i=0,漏掉i=1的比较,正确范围应该是range(n//2)。 - 冗余输出:找到不匹配字符时会打印两次"False",属于重复输出。
修复后的代码
def is_palindrome(input_string): # 去除所有空格(strip仅处理首尾,replace处理全部空格) new_string = input_string.replace(" ", "") n = len(new_string) is_valid = True # 循环比较前半段与后半段对应位置的字符 for i in range(n // 2): if new_string[i] != new_string[n - 1 - i]: is_valid = False break # 找到不匹配就提前终止循环 print(is_valid)
修复说明
- 用
replace(" ", "")替代strip(),确保去掉字符串中所有空格,而不只是首尾。 - 直接使用字符串索引访问字符,无需额外转列表,简化逻辑。
- 提前初始化
is_valid标记,避免变量未定义的问题。 - 统一循环范围
n//2,无论字符串长度奇偶都适用(奇数长度的中间字符无需比较)。 - 找到不匹配字符后立即
break循环,提升代码效率,避免无效遍历。
内容的提问来源于stack exchange,提问作者Lalitha
相关产品推荐
相关产品推荐

