¿Cómo hacer que esto funcione en loop en Python?

Quiero escupir una lista de palíndromos hasta que dé una cierta carta.

Se trata de esta parte:

def pyramid_palindrome(last_letter): for letter in range(97,last_letter): last_letter = last_letter - (last_letter-1) print call_first_part_palindrome(last_letter) print call_second_part_palindrome(last_letter) 

Lo que querría es, para hacer esto:

 a aba abcba abcdcba abcdedcba abcdefedbca abcdefgfedcba abcdefghgfedcba .... 

Estoy pensando así:

“Daré la última letra como entrada, y se mantendrá iterando el palíndromo hasta que se compruebe la última letra”.

El problema es que no logro escupir los palíndromos uno por uno, ascendiéndolos como una pirámide. ¿Alguien me puede apuntar en la dirección correcta?

¿Tengo razón cuando digo que necesito usar un for loop en la primera función?

Este es mi código completo:

 def pyramid_palindrome(last_letter): for letter in range(97,last_letter): last_letter = last_letter - (last_letter-1) print call_first_part_palindrome(last_letter) print call_second_part_palindrome(last_letter) def call_first_part_palindrome(last_letter): letters_a_to_y = "" for letter in range(97,last_letter): letters_a_to_y += chr(letter) return(letters_a_to_y) def call_second_part_palindrome(last_letter): letters_y_to_a = "" for letter in range(last_letter,96,-1): letters_y_to_a += chr(letter) return(letters_y_to_a) pyramid_palindrome(112) 

Creo que estoy cerca, pero no puedo hacer el toque final.

Su problema fue al llamar a sus dos funciones de palíndromo y sobre cómo estaba cambiando el valor de last_letter :

Intenté modificar tu código lo menos posible:

 def pyramid_palindrome(last_letter): for letter in range(97,last_letter): print(call_first_part_palindrome(letter) + call_second_part_palindrome(letter-2)) 

Y esto sigue siendo el mismo:

 def call_first_part_palindrome(last_letter): letters_a_to_y = "" for letter in range(97,last_letter): letters_a_to_y += chr(letter) return(letters_a_to_y) def call_second_part_palindrome(last_letter): letters_y_to_a = "" for letter in range(last_letter,96,-1): letters_y_to_a += chr(letter) return(letters_y_to_a) pyramid_palindrome(112) 

Qué salidas:

 a aba abcba abcdcba abcdedcba abcdefedcba abcdefgfedcba abcdefghgfedcba abcdefghihgfedcba abcdefghijihgfedcba abcdefghijkjihgfedcba abcdefghijklkjihgfedcba abcdefghijklmlkjihgfedcba abcdefghijklmnmlkjihgfedcba 

Toda esta lógica podría simplificarse utilizando el corte de cadena junto con string.ascii_lower como:

 import string alphs = string.ascii_lowercase # returns string of lower case characters last_letter = 'f' for i in range(len(alphs)): print alphs[:i]+alphs[i::-1] if alphs[i] == last_letter: # break the loop when `last_letter` is found break 

el cual generará salida como:

 a aba abcba abcdcba abcdedcba abcdefedcba 

Editar: Si no desea importar una string , puede obtener la cadena de caracteres en minúscula utilizando:

 alphs = ''.join(chr(i) for i in range(97,123)) 

Su código es más complicado de lo que debe ser, y hace un trabajo innecesario para generar cada cadena de letras desde cero.

No estoy seguro de por qué no desea importar la cadena de letras del módulo de string , pero puede generar fácilmente la cadena de letras una vez y luego cortarla para obtener las subcadenas necesarias para construir cada palíndromo. El siguiente código funciona en Python 2 o 3.

 def pyramid_palindrome(last_letter): letters = ''.join([chr(i) for i in range(97, last_letter)]) for i in range(last_letter - 97): print(letters[:i] + letters[i::-1]) pyramid_palindrome(102) 

salida

 a aba abcba abcdcba abcdedcba 

Alternativamente, mantenga las letters como una lista y use .join en las listas .join :

 def pyramid_palindrome(last_letter): letters = [chr(i) for i in range(97, last_letter)] for i in range(last_letter - 97): print(''.join(letters[:i] + letters[i::-1])) 

En teoría, es más rápido agregar dos listas que dos cadenas, aunque hay optimizaciones en CPython para cadenas pequeñas, por lo que es posible que no note la diferencia a menos que las cadenas tengan más de 1000 o más. OTOH, llamar. .join vez en letters es probablemente mejor que llamarlo para cada palíndromo.


Aquí hay una pequeña variación de la primera versión. Guardamos todos los palíndromos en una lista de cadenas. Luego, la persona que llama puede unirse a esa lista de cadenas en una cadena e imprimirla con una llamada de print .

 def pyramid_palindrome(last_letter): letters = [chr(i) for i in range(97, last_letter)] return [''.join(letters[:i] + letters[i::-1]) for i in range(last_letter - 97)] print('\n'.join(pyramid_palindrome(102)))