Próbowałem napisać metodę o nazwie is_palidrome_v3 (s), aby porównać pierwszą i ostatnią literę Słowo, a następnie 2 i ostatniej litery, aż para nie jest taka sama, a ostatecznie sprawdź, czy indeks jest> = 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

Ale kiedy go uruchomię:

is_palidrome_v3('noon')

Istnieje błąd:

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 

Czy ktoś może mi powiedzieć, co jest w porządku?

Dzięki!!!

2
user2988464 5 grudzień 2013, 14:05

1 odpowiedź

Masz jeden błąd. Jeśli I == Len (s), to s [i] jest indeksowaniem, ponieważ liczni indeksów z 0.

Więc z

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

    return i >= len(s)  #2

Należy pamiętać, że zmieniłem s [LEN (S) - I] do S [-i], jeśli używasz negatywnych indeksów, to liczy się z końca, więc jest to łatwe krócej, a także naprawiono drugi błąd: S [Len ( S) - I] jest również indexError, tym razem, kiedy mam 0.

Myślę, że próbujesz nauczyć się Pythona krok po kroku (stąd V3), więc nie zamierzam zawracać sobie głowy podając różnorodne sposoby, aby to zrobić :-)

1
RemcoGerlich 5 grudzień 2013, 10:13