Python:Palidrome(字符串索引超出范围)

use*_*464 2 python

我试着编写一个名为is_palidrome_v3(s)的方法来比较单词的第一个和最后一个字母,然后是第二个和最后一个字母,直到该对不相同,最后检查索引是否> = len(s)// 2

def is_palidrome_v3(s):
    ''' (str) -> bool

    Return True if and only if s is a palidrome.

    >>> is_palidrome_v3('noon')
    True
    >>> is_palidrome_v3('racecar')
    True
    >>> is_palidrome_v3('dented')
    False
    '''

    i = 0
    while i <= len(s) // 2 and s[i] == s[len(s) - i]:
        i = i + 1

    return i >= len(s)//2
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时:

is_palidrome_v3('noon')
Run Code Online (Sandbox Code Playgroud)

有一个错误:

Traceback (most recent call last): 
File "<pyshell#0>", line 1, in <module> is_palidrome_v3('noon') 
File "C:\Users\James\Google-h0925473\Learning Programming\Python\Python Fundamental (Coursera)\is_palidrome_v1.py", line 67, in is_palidrome_v3 while i <= len(s) // 2 and s[i] == s[len(s) - i]: 
IndexError: string index out of range 
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我里面有什么不对吗?

谢谢!!!

Asw*_*esh 5

对于你的代码,

这条线:

while i<=len(s)//2 and s[i] == s[len(s)-i] 
Run Code Online (Sandbox Code Playgroud)

是问题.在第一次迭代中,条件是:

while 0<=len(s)//2 and s[0] == s[len(s)]
Run Code Online (Sandbox Code Playgroud)

并且索引len(s)无法存在于字符串中.因此错误.将其更改为:

while i<len(s)//2 and s[0] == s[len(s)-i-1]:
Run Code Online (Sandbox Code Playgroud)

这样可以解决问题

为什么要这么大惊小怪呢?

结帐这个很酷的方式:

if s == s[::-1]:
    return True
return False
Run Code Online (Sandbox Code Playgroud)

s [:: - 1]第一个:说我们必须从头开始迭代.第二个:说迭​​代直到结束.所以,::通常意味着我们必须遍历整个字符串.最后的-1表示必须从右侧(反向)解释字符串.所以我们检查字符串是否等于它的反向

  • `return s == s [:: - 1]` (5认同)
  • 你应该解释为什么`s [:: - 1]`反转字符串.OP可能正在尝试学习Python. (2认同)
  • @ user2988464的[a:b:c]`意味着从`[a,b]`踩到`c`,即`s [:: 2]`意味着从列表中取出所有其他元素.`s [-1]`表示`s`的最后一个字符.`s [:: - 1]`表示取整个字符串,但从结尾到开头. (2认同)