No hay una reverse
función integrada para el str
objeto de Python . ¿Cuál es la mejor manera de implementar este método?
Si proporciona una respuesta muy concisa, explique su eficiencia. Por ejemplo, si el str
objeto se convierte en un objeto diferente, etc.
Respuestas:
Qué tal si:
Esta es una sintaxis de corte extendida . Funciona haciendo
[begin:end:step]
: al dejar de comenzar y terminar y al especificar un paso de -1, invierte una cadena.fuente
b = a.decode('utf8')[::-1].encode('utf8')
pero gracias por la dirección correcta!.decode('utf8')
es necesario, significaa
que no contiene ningún objeto de cadena, sino bytes.@ Paolo
s[::-1]
es el más rápido; es un enfoque más lento (quizás más legible, pero eso es discutible)''.join(reversed(s))
.fuente
join
tiene que construir la lista de todos modos para poder obtener el tamaño.''.join(list(reversed(s)))
puede ser un poco más rápidoMi propia experiencia con esta pregunta es académica. Sin embargo, si eres un profesional en busca de la respuesta rápida, usa un segmento que paso por
-1
:o más legible (pero más lento debido a las búsquedas de nombres de métodos y al hecho de que join forma una lista cuando se le da un iterador)
str.join
:o para facilitar la lectura y la reutilización, coloque el sector en una función
y entonces:
Explicación más larga
Si estás interesado en la exposición académica, sigue leyendo.
Aquí hay un par de cosas sobre las cadenas de Python que debes saber:
En Python, las cadenas son inmutables . Cambiar una cadena no modifica la cadena. Crea uno nuevo.
Las cuerdas son cortables. Al cortar una cadena se obtiene una nueva cadena desde un punto de la cadena, hacia atrás o hacia adelante, a otro punto, en incrementos dados. Toman notación de corte o un objeto de corte en un subíndice:
El subíndice crea un corte al incluir dos puntos dentro de las llaves:
Para crear un corte fuera de los corchetes, deberá crear un objeto de corte:
Un enfoque legible:
Si bien
''.join(reversed('foo'))
es legible, requiere llamar a un método de cadenastr.join
, en otra función llamada, que puede ser bastante lenta. Pongamos esto en una función, volveremos a ello:Enfoque más eficaz:
Mucho más rápido está usando un corte inverso:
Pero, ¿cómo podemos hacer que esto sea más legible y comprensible para alguien menos familiarizado con las rebanadas o la intención del autor original? Creemos un objeto de corte fuera de la notación de subíndice, asígnele un nombre descriptivo y páselo a la notación de subíndice.
Implementar como función
Para implementar esto realmente como una función, creo que es semánticamente lo suficientemente claro como para usar simplemente un nombre descriptivo:
Y el uso es simplemente:
Lo que tu maestro probablemente quiere:
Si tiene un instructor, probablemente quieran que comience con una cadena vacía y que cree una nueva cadena a partir de la anterior. Puede hacer esto con sintaxis pura y literales usando un ciclo while:
Esto es teóricamente malo porque, recuerde, las cadenas son inmutables , por lo que cada vez que parece que está agregando un carácter a su nombre
new_string
, teóricamente está creando una nueva cadena cada vez. Sin embargo, CPython sabe cómo optimizar esto en ciertos casos, de los cuales este caso trivial es uno.Mejores prácticas
Teóricamente mejor es recopilar sus subcadenas en una lista y unirlas más tarde:
Sin embargo, como veremos en los tiempos siguientes para CPython, esto en realidad lleva más tiempo, porque CPython puede optimizar la concatenación de cadenas.
Tiempos
Aquí están los horarios:
CPython optimiza la concatenación de cadenas, mientras que otras implementaciones pueden no :
fuente
while
y disminuyendo el índice, aunque quizás esto es menos legible:for i in range(len(a_string)-1, -1, -1):
. Sobre todo, me encanta que la cadena de ejemplo que has elegido es el único caso en el que nunca necesitarías revertirla, y no podrías saber si lo hubieras hecho :)Respuesta rápida (TL; DR)
Ejemplo
Respuesta detallada
Antecedentes
Esta respuesta se proporciona para abordar la siguiente preocupación de @odigity:
Problema
Solución
Trampas
string.reverse()
string.reverse()
para evitar la notación de corte.print 'coup_ate_grouping'[-4:] ## => 'ping'
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
print 'coup_ate_grouping'[-1] ## => 'g'
[-1]
pueden desanimar a algunos desarrolladoresRazón fundamental
Python tiene una circunstancia especial a tener en cuenta: una cadena es un tipo iterable .
Una razón para excluir un
string.reverse()
método es incentivar a los desarrolladores de Python a aprovechar el poder de esta circunstancia especial.En términos simplificados, esto simplemente significa que cada carácter individual en una cadena se puede operar fácilmente como parte de una disposición secuencial de elementos, al igual que las matrices en otros lenguajes de programación.
Para comprender cómo funciona esto, revisar example02 puede proporcionar una buena visión general.
Ejemplo02
Conclusión
La carga cognitiva asociada con la comprensión de cómo funciona la notación de corte en Python puede ser demasiado para algunos adoptantes y desarrolladores que no desean invertir mucho tiempo en aprender el idioma.
Sin embargo, una vez que se entienden los principios básicos, el poder de este enfoque sobre los métodos de manipulación de cadenas fijas puede ser bastante favorable.
Para aquellos que piensan lo contrario, existen enfoques alternativos, como funciones lambda, iteradores o declaraciones simples de funciones únicas.
Si lo desea, un desarrollador puede implementar su propio método string.reverse (), sin embargo, es bueno entender la razón detrás de este aspecto de Python.
Ver también
fuente
Las respuestas existentes solo son correctas si se ignoran los modificadores Unicode / grupos de grafemas. Me ocuparé de eso más tarde, pero primero eche un vistazo a la velocidad de algunos algoritmos de inversión:
Puede ver que el tiempo para la comprensión de la lista (
reversed = string[::-1]
) es en todos los casos el más bajo (incluso después de corregir mi error tipográfico).Inversión de cuerdas
Si realmente quieres invertir una cadena en el sentido común, es MUCHO más complicado. Por ejemplo, tome la siguiente cadena ( dedo marrón apuntando hacia la izquierda , dedo amarillo apuntando hacia arriba ). Esos son dos grafemas, pero 3 puntos de código unicode. El adicional es un modificador de piel .
Pero si lo invierte con cualquiera de los métodos dados, obtendrá el dedo marrón apuntando hacia arriba , el dedo amarillo apuntando hacia la izquierda . La razón de esto es que el modificador de color "marrón" todavía está en el medio y se aplica a lo que esté antes. Entonces tenemos
y
Los clústeres de grafemas Unicode son un poco más complicados que solo los puntos de código modificador. Afortunadamente, hay una biblioteca para manejar grafemas :
y por lo tanto la respuesta correcta sería
que también es, con mucho, el más lento:
El código
fuente
1. usando notación de corte
2. utilizando la función invertida ()
3. utilizando recursividad
fuente
RecursionError: maximum recursion depth exceeded while calling a Python object
. Ej:rev_string("abcdef"*1000)
Una forma menos desconcertante de verlo sería:
En inglés [-1 :: - 1] se lee como:
fuente
-1
embargo, todavía no es necesario.Invierta una cadena en python sin usar reverse () o [:: - 1]
fuente
Esta también es una forma interesante:
o similar:
Otra forma más 'exótica' usando byterarray que admite .reverse ()
Producirá:
fuente
fuente
fuente
Esto funciona al recorrer una cadena y asignar sus valores en orden inverso a otra cadena.
fuente
Aquí hay uno no lujoso:
fuente
Aquí hay uno sin
[::-1]
oreversed
(para fines de aprendizaje):puedes usar
+=
para concatenar cadenas perojoin()
es más rápido.fuente
Método recursivo:
ejemplo:
fuente
Todas las soluciones anteriores son perfectas, pero si estamos tratando de revertir una cadena usando for loop en python se volverá un poco complicado, así que aquí es cómo podemos revertir una cadena usando for loop
Espero que este sea útil para alguien.
fuente
Esa es mi manera:
fuente
Hay muchas formas de invertir una cadena, pero también creé otra solo por diversión. Creo que este enfoque no es tan malo.
fuente
Esta clase usa funciones mágicas de python para invertir una cadena:
Salida
Referencia
fuente
Para resolver esto en forma programada para la entrevista
Salida:
fuente
Con Python 3 puede invertir la cadena en el lugar, lo que significa que no se asignará a otra variable. Primero debe convertir la cadena en una lista y luego aprovechar la
reverse()
función.https://docs.python.org/3/tutorial/datastructures.html
fuente
Esta es una función inversa simple y significativa, fácil de entender y codificar
fuente
Aquí es simplemente:
imprimir "loremipsum" [- 1 :: - 1]
y algunos lógicamente:
salida:
muspimerol
fuente
Invierte una cuerda sin magia de pitón.
fuente
Claro, en Python puedes hacer cosas muy elegantes de 1 línea. :)
Aquí hay una solución simple y completa que podría funcionar en cualquier lenguaje de programación.
fuente
SALIDA
fuente
Puede usar la función invertida con una lista completa. Pero no entiendo por qué este método fue eliminado en Python 3, fue innecesariamente.
fuente
.join
o algo para que sea una respuesta válida[c for c in string]
es equivalente alist(string)
.