Estoy intentando buscar un palíndromo con Python. El código que tengo es muy intensivo en bucles for
.
Y me parece que el mayor error que comete la gente al pasar de C a Python es tratar de implementar la lógica de C usando Python, lo que hace que las cosas se ejecuten lentamente, y simplemente no se aprovecha el lenguaje.
Veo en este sitio web. Search for "C-style for", que Python no'tiene bucles for al estilo de C. Puede que esté anticuado, pero yo lo interpreto como que Python tiene sus propios métodos para esto.
He intentado buscar por ahí, pero no encuentro muchos consejos actualizados (Python 3) para esto. ¿Cómo puedo resolver un reto de palíndromo en Python, sin usar el bucle for?
He hecho esto en C en clase, pero quiero hacerlo en Python, a título personal. El problema es del Proyecto Euler, gran sitio Por cierto,.
def isPalindrome(n):
lst = [int(n) for n in str(n)]
l=len(lst)
if l==0 || l==1:
return True
elif len(lst)%2==0:
for k in range (l)
#####
else:
while (k<=((l-1)/2)):
if (list[]):
#####
for i in range (999, 100, -1):
for j in range (999,100, -1):
if isPalindrome(i*j):
print(i*j)
break
Me falta mucho código aquí. Los cinco hashtags son sólo recordatorios para mí.
Preguntas concretas:
En C, haría un bucle for comparando el índice 0 con el índice max, y luego el índice 0+1 con el max-1, hasta llegar a algo. ¿Cuál es la mejor manera de hacer esto en Python?
Mi bucle for (in en el rango (999, 100, -1), ¿es una mala forma de hacerlo en Python?
¿Alguien tiene algún buen consejo, o buenas páginas web, o recursos para gente en mi situación? No soy programador, no aspiro a serlo, sólo quiero aprender lo suficiente para que cuando escriba mi tesis de licenciatura (ingeniería eléctrica), no tenga que APRENDER simultáneamente un lenguaje de programación aplicable a la vez que intento obtener buenos resultados en el proyecto. "Cómo pasar de C básico a una gran aplicación de Python", ese tipo de cosas.
Cualquier trozo de código específico para hacer una gran solución a este problema también sería apreciado, necesito aprender buenos algoritmos.. Estoy imaginando 3 situaciones. Si el valor es cero o un solo dígito, si es de longitud impar, y si es de longitud par. Estaba planeando escribir bucles for...
PD: El problema es: Encontrar el producto de mayor valor de dos enteros de 3 dígitos que también sea un palíndromo.
Una forma pitónica de determinar si un valor dado es un palíndromo:
str(n) == str(n)[::-1]
Explicación:
n
es igual a la representación de cadena invertida de n
.[::-1]
se encarga de invertir la cadena==
.Una alternativa a la poco intuitiva sintaxis [::-1]
es ésta:
>>> test = "abcba"
>>> test == ''.join(reversed(test))
True
La función reversed
devuelve una secuencia invertida de los caracteres de test
.
La función ''.join()
une de nuevo esos caracteres sin nada entre ellos.
La parte impresionante de python son las cosas que puedes hacer con él. No tienes que usar índices para las cadenas.
Lo siguiente funcionará (usando rebanadas)
def palindrome(n):
return n == n[::-1]
Lo que hace es simplemente invertir n, y comprobar si son iguales. n[::-1]
invierte n (el -1 significa disminuir)
Con respecto a lo anterior, quieres usar xrange
en lugar de range (porque range creará una lista real, mientras que xrange es un generador rápido)
Mis opiniones sobre la pregunta 3
Aprendí C antes que Python, y sólo leí los documentos, y jugué con él usando la consola. (y haciendo problemas del Proyecto Euler también :)