2011-03-05 21 views
6

Po prostu zaczynam w pythonie i próbuję przetestować ciąg znaków wprowadzony przez użytkownika jako palindrom. Mój kod to:Python reverse() dla palindromów

x=input('Please insert a word') 
y=reversed(x) 
if x==y: 
    print('Is a palindrome') 
else: 
    print('Is not a palindrome') 

ta zawsze zwraca wartość false, ponieważ y staje się coś podobnego <reversed object at 0x00E16EF0> zamiast odwróconym ciągiem. O czym ja nie wiem? Jak byś zakodował ten problem?

+2

Tylko dlatego, że funkcja o nazwie jak coś, czego potrzebujesz, to nie znaczy, że możesz go użyć bez zobaczenia Definicja t w pierwszej kolejności. Spójrz na [tę stronę] (http://docs.python.org/library/functions.html#reversed). 'odwrócony' zwraca * iterator *, i jestem prawie pewien, że nie tego chciałeś. – darioo

+0

co jeśli użyłem: 'y = [x] .reverse'? –

+0

To naprawdę nie jest to, czego chcesz z wielu powodów: '[x]' tworzy listę pojedynczych elementów, gdzie pierwszym elementem jest 'x'. Następnie, po odwróceniu listy, otrzymujesz teraz listę zamiast iteratora, więc 'y' nie jest ciągiem znaków. – user470379

Odpowiedz

16

Wypróbuj y = x[::-1]. Wykorzystuje to splicing, aby uzyskać odwrotność ciągu znaków.

reversed(x) zwraca iterator do pętli ciągu znaków w ciągu w odwrotnej kolejności, nie jakiegoś napisu można bezpośrednio porównać do x.

+2

To nie jest taki dobry pomysł w przypadku dużych ciągów i list. –

8

reversed zwraca iterator, który można przekształcić w ciąg przy użyciu metody join:

y = ''.join(reversed(x)) 
+0

Jeszcze lepiej, 'str (odwrócony (x))' – kindall

+4

@kindall '' – user470379

+1

Ahhhhhhhhrgh, przepraszam, pierdnięcie mózgu. Założono, że konstruktor 'str()' wykona dowolną iterację i połączy ją w łańcuch. Jest to oczywiście całkowicie błędne. – kindall

1

na przyszłość, lambda z powyższych odpowiedzi dla szybkiej kontroli palindrom:

isPali = lambda num: str(num) == str(num)[::-1] 

przykład użycia:

isPali(9009) #returns True 
0

Spróbuj tego kodu.

def pal(name): 
     sto_1 = [] 
     for i in name: 
       sto_1.append(i) 

     sto_2 = [] 
     for i in sto_1[::-1]: 
       sto_2.append(i) 

     for i in range(len(name)): 
       if sto_1[i] == sto_2[i]: 
         return "".join(sto_1), "".join(sto_2) 
       else: 
         return "no luck" 

name = raw_input("Enter the word :") 
print pal(name) 
+1

lub po prostu: '' 'def pal (name): nazwa powrotu == nazwa [:: - 1]' '' ' –

0
list(reverse(mystring)) == list(mystring) 

lub w przypadku numerów

list(reverse(str(mystring))) == list(str(mystring)) 
0

Spróbuj kod:

def palindrome(string): 
    i = 0 
    while i < len(string): 
     if string[i] != string[(len(string) - 1) - i]: 
      return False 
     i += 1 
    return True 

druku palindrom ("Hannah")