¿Dónde está el error en esta función para comprobar si hay palíndromo?

A continuación se muestra el código para verificar si una lista es un palíndromo o no. Está dando la salida correcta para 983. ¿A dónde me voy mal?

def palindrome(num): flag=0 r=num[::-1] for i in range (0, len(num)-1): if(r[i]==num[i]): flag=1 else: flag=0 return flag 

Debes volver tan pronto como haya un desajuste. Además, solo necesitas iterar hasta la mitad de la longitud:

 def function(...): ... for i in range (0, (len(num) + 1) / 2): if r[i] != num[i]: return False return True 

Por cierto, no necesitas ese bucle. Simplemente puedes hacer:

 def palindrome(num): return num == num[::-1] 

Esto sería más fácil:

 def palindrome(num): if num[::-1] == num: return True else: return False 

Tu bucle for comprueba todos los pares de caracteres, sin importar si se encontraron discrepancias o no. Por lo tanto, en el caso de la cadena ‘38113’ devolverá True , porque la variable de marca se establecerá en True después de la verificación de la igualdad del último dígito en ‘38113’ y su versión invertida ‘31183’ (ambas iguales a 3, mientras que la cadena no es un palíndromo).
Por lo tanto, debe devolver False justo después de haber encontrado la falta de coincidencia; Si marcó todos los caracteres y no lo encontró, entonces devuelva True , así:

 def palindrome(num): r = num[::-1] for i in range (0, len(num)-1): if(r[i] != num[i]): return False return True 

Además, como alguien señaló, será mejor usar las rebanadas de python: consulte la documentación .

Solo para el registro, y para aquellos que buscan una forma más algorítmica de validar si una cadena dada es palíndromo, dos formas de lograr lo mismo (usando while y for bucles):

 def is_palindrome(word): letters = list(word) is_palindrome = True i = 0 while len(letters) > 0 and is_palindrome: if letters[0] != letters[-1]: is_palindrome = False else: letters.pop(0) if len(letters) > 0: letters.pop(-1) return is_palindrome 

Y … la segunda:

 def is_palindrome(word): letters = list(word) is_palindrome = True for letter in letters: if letter == letters[-1]: letters.pop(-1) else: is_palindrome = False break return is_palindrome 
 str1=str(input('enter string:')) save=str1 revstr=str1[::-1] if save==revstr: print("string is pailandrom") else: print("not pailadrom") 
 # We are taking input from the user. # Then in the function we are reversing the input ie a using # slice [::-1] and # storing in b # It is palindrome if both a and b are same. a = raw_input("Enter to check palindrome:") def palin(): #Extended Slices to reverse order. b = a[::-1] if a == b: print "%s is palindrome" %a else: print "%s is not palindrome" %a palin() 

esto sería mucho más fácil:

 def palindrome(num): a=num[::-1] if num==a: print (num,"is palindrome") else: print (num,"is not palindrome") x=input("Enter to check palindrome:") palindrome(x) 

Aquí en mi opinión está el más elegante:

 def is_palindrome(s): if s != '': if s[0] != s[-1]: return False return is_palindrome(s[1:-1]) return True 

también es el mismo código en la función is_palindrome ():

 pip install is-palindrome >>> from is_palindrome import is_palindrome >>> x = "sitonapanotis" >>> y = is_palindrome(x) >>> y True 

Tenga cuidado de tener en cuenta el guión contra el guión bajo cuando instale o importe

 a="mom" b='mom'[::-1] # reverse the string if a==b: # if original string equals to reversed print ("palindrome ") else: print ("not a palindrome ") 
 def palindrome(a): a=raw_input('Enter :') b=a[::-1] return a==b