vuelta una reves poner palabra numero leer invertir funcion for escribir darle como ciclo cadenas cadena python string function for-loop reverse

una - funcion al reves python



¿Invertir una cadena sin usar reverse() o[::-1]? (30)

Acabo de resolver esto en la academia de código y estaba verificando mis respuestas y encontré esta lista. así que con una comprensión muy limitada de Python acabo de hacer esto y funcionó para funcionar.

def reverse(s): i = len(s) - 1 sNew = '''' while i >= 0: sNew = sNew + str(s[i]) i = i -1 return sNew

Me encontré con un extraño ejercicio de Codecademy que requería una función que tomaría una cadena como entrada y la devolvería en orden inverso. El único problema era que no se podía usar el método invertido o la respuesta común aquí en stackoverflow, [::-1] .

Obviamente, en el mundo real de la programación, lo más probable es que vaya con el método de división extendida , o incluso con la función reversed , pero tal vez haya algún caso en el que esto no funcione.

A continuación presento una solución en estilo de preguntas y respuestas, en caso de que sea útil para las personas en el futuro.


Aquí está mi contribución:

def rev(test): test = list(test) i = len(test)-1 result = [] print test while i >= 0: result.append(test.pop(i)) i -= 1 return "".join(result)


Aquí hay uno que usa una lista como pila:

def reverse(s): rev = [_t for _t in s] t = '''' while len(rev) != 0: t+=rev.pop() return t


Creé diferentes versiones de cómo invertir una cadena en python en mi repositorio: https://github.com/fedmich/Python-Codes/tree/master/Reverse%20a%20String

Puedes hacerlo usando la técnica de comprensión de listas o lambda :

# Reverse a string without using reverse() function s = ''Federico''; li = list( s ) #convert string to list ret = [ li[i-1] for i in xrange(len(li),0,-1) ] #1 liner lambda print ( "".join( ret ) )

o haciendo un ciclo hacia atrás para

# Reverse a string without using reverse() function s = ''Federico''; r = [] length = len(s) for i in xrange(length,0,-1): r.append( s[ i - 1] ) print ( "".join(r) )


Esta es mi solución usando el bucle for i in range:

def reverse(string): tmp = "" for i in range(1,len(string)+1): tmp += string[len(string)-i] return tmp

Es bastante fácil de entender. Empiezo desde 1 para evitar el índice fuera de límite.


Esta es una forma de hacerlo con un ciclo while:

def reverse(s): t = -1 s2 = '''' while abs(t) < len(s) + 1: s2 = s2 + s[t] t = t - 1 return s2


Esta es una pregunta muy interesante, me gustaría ofrecer una respuesta simple de un trazador de líneas:

>>> S=''abcdefg'' >>> ''''.join(item[1] for item in sorted(enumerate(S), reverse=True)) ''gfedcba''

Breve explicacion:

enumerate() devuelve [(0, ''a''), (1, ''b''), (2, ''c''), (3, ''d''), (4, ''e''), (5, ''f''), (6, ''g'')] . Los índices y los valores. Para invertir los valores, solo instálelo por orden de sorted() . Finalmente, simplemente ponlo de nuevo junto a una str


Has recibido muchas respuestas alternativas, pero solo para agregar otra solución simple: lo primero que se me ocurrió es algo así:

def reverse(text): reversed_text = "" for n in range(len(text)): reversed_text += text[-1 - n] return reversed_text

No es tan rápido como algunas de las otras opciones que la gente ha mencionado (o construido en métodos), pero es fácil de seguir ya que simplemente estamos usando la longitud de la cadena de text para concatenar un carácter a la vez cortando desde el extremo hacia el frente.


Hoy me pidieron este mismo ejercicio en lápiz y papel, así que se me ocurrió esta función para las listas:

def rev(s): l = len(s) for i,j in zip(range(l-1, 0, -1), range(l//2)): s[i], s[j] = s[j], s[i] return s

que se puede usar con cadenas con "".join(rev(list("hello")))


Inspirado por la respuesta de Jon, ¿qué tal este

word = ''hello'' q = deque(word) ''''.join(q.pop() for _ in range(len(word)))


La forma en que puedo pensar sin usar ninguna función incorporada:

a = ''word'' count = 0 for letter in a: count += 1 b = '''' for letter in a: b += a[count-1] count -= 1

Y si imprime b:

print b drow


La respuesta de Blender es encantadora, pero para una cadena muy larga, dará como resultado un enorme RuntimeError: maximum recursion depth exceeded . Uno podría refactorizar el mismo código en un ciclo while, como uno frecuentemente debe hacer con la recursión en python. Obviamente todavía está mal debido a problemas de tiempo y memoria, pero al menos no tendrá errores.

def reverse(text): answer = "" while text: answer = text[0] + answer text = text[1:] return answer


No es muy inteligente, pero es una solución difícil

def reverse(t): for j in range(len(t) // 2): t = t[:j] + t[- j - 1] + t[j + 1:- j - 1] + t[j] + t[len(t) - j:] return t


Pointfree:

from functools import partial from operator import add flip = lambda f: lambda x, y: f(y, x) rev = partial(reduce, flip(add))

Prueba:

>>> rev(''hello'') ''olleh''


Puedes hacer simplemente así

def rev(str): rev = "" for i in range(0,len(str)): rev = rev + str[(len(str)-1)-i] return rev


Simplemente puede invertir iterar su cadena comenzando desde el último caracter. Con Python puede usar la comprensión de listas para construir la lista de caracteres en orden inverso y luego unirlos para obtener la cadena invertida en un solo trazo:

def reverse(s): return "".join([s[-i-1] for i in xrange(len(s))])

si no se te permite usar indexación negativa, debes reemplazar s[-i-1] por s[len(s)-i-1]


Solo he estado codificando Python durante unos días, pero creo que esta fue una solución bastante limpia. Cree una lista vacía, recorra cada letra de la cadena y añádala al principio de la lista, devuelva la lista unida como una cadena.

def reverse(text): backwardstext = [] for letter in text: backwardstext.insert(0, letter) return ''''.join(backwardstext)


Solo otra opción:

from collections import deque def reverse(iterable): d = deque() d.extendleft(iterable) return ''''.join(d)


También acabo de resolver el ejercicio correspondiente en codeacademy y quería comparar mi enfoque con los demás. No he encontrado la solución que utilicé hasta ahora, así que pensé en registrarme aquí y brindar mi solución a otros. Y tal vez recibo una sugerencia o un comentario útil sobre cómo mejorar el código.

Ok aquí va, no usé ninguna lista para almacenar la cadena, en vez de eso acabo de acceder al índice de cadena. Me tomó un poco al principio lidiar con el len () y el número de índice, pero al final funcionó :).

def reverse(x): reversestring = "" for n in range(len(str(x))-1,-1, -1): reversestring += x[n] return reversestring

Todavía me pregunto si el reversestring = "" podría resolverse de una manera más elegante, o si es "malo estilo" incluso, pero no pude encontrar una respuesta hasta el momento.


También puedes hacerlo con recursión:

def reverse(text): if len(text) <= 1: return text return reverse(text[1:]) + text[0]

Y un simple ejemplo para la cadena hello :

reverse(hello) = reverse(ello) + h # The recursive step = reverse(llo) + e + h = reverse(lo) + l + e + h = reverse(o) + l + l + e + h # Base case = o + l + l + e + h = olleh


Todo lo que hice para lograr una cadena inversa es utilizar la función xrange con la longitud de la cadena en un ciclo for y dar un paso atrás de la siguiente manera:

myString = "ABC" for index in xrange(len(myString),-1): print index

Mi salida es "CBA"


Una versión golfed: r=lambda x:"".join(x[i] for i in range(len(x-1),-1,-1)) Join r=lambda x:"".join(x[i] for i in range(len(x-1),-1,-1)) .


Usé esto:

def reverse(text): s="" l=len(text) for i in range(l): s+=text[l-1-i] return s


Utilice el range invertido:

def reverse(strs): for i in xrange(len(strs)-1, -1, -1): yield strs[i] ... >>> ''''.join(reverse(''hello'')) ''olleh''

xrange o range con -1 paso devolvería los elementos en orden inverso, por lo que necesitamos iterar de len(string)-1 a -1 (exclusivo) y obtener elementos de la cadena uno por uno.

>>> list(xrange(len(strs) -1, -1 , -1)) [4, 3, 2, 1, 0] #iterate over these indexes and fetch the items from the string

Un trazador de líneas:

def reverse(strs): return ''''.join([strs[i] for i in xrange(len(strs)-1, -1, -1)]) ... >>> reverse(''hello'') ''olleh''


tienes suficiente respuesta.

Solo quiero compartir otra forma.

puedes escribir una pequeña función para invertir y comparar la salida de la función con la cadena dada

var = ''''

def reverse (datos):

for i in data: var = i + var return var

si no var == datos:

imprimir "No palindrome"

else:

imprimir "Palindrome"


EDITAR

La actividad reciente en esta cuestión me llevó a mirar hacia atrás y cambiar mi solución a una línea rápida usando un generador:

rev = ''''.join([text[len(text) - count] for count in xrange(1,len(text)+1)])

Aunque obviamente hay algunas respuestas mejores aquí, como un paso negativo en el rango o la función de xrange. La siguiente es mi solución original:

Aquí está mi solución, lo explicaré paso a paso

def reverse(text): lst = [] count = 1 for i in range(0,len(text)): lst.append(text[len(text)-count]) count += 1 lst = ''''.join(lst) return lst print reverse(''hello'')

Primero, tenemos que pasar un parámetro a la función, en este caso text .

A continuación, configuré una lista vacía, llamada lst para usar más tarde. (De hecho, no sabía que necesitaría la lista hasta que llegué al ciclo for , verás por qué es necesario en un segundo).

La variable de count tendrá sentido una vez que entre al ciclo for

Echemos un vistazo a una versión básica de lo que estamos tratando de lograr:

Tiene sentido que agregar el último carácter a la lista comience en el orden inverso. Por ejemplo:

>>lst = [] >>word = ''foo'' >>lst.append(word[2]) >>print lst [''o'']

Pero para continuar invirtiendo el orden, necesitamos agregar la word[1] y luego la word[0] :

>>lst.append(word[2]) >>lst.append(word[1]) >>lst.append(word[0]) >>print lst [''o'',''o'',''f'']

Esto es genial, ahora tenemos una lista que tiene nuestra palabra original en orden inverso y puede convertirse de nuevo en una cadena usando .join() . Pero hay un problema. Esto funciona para la palabra foo, incluso funciona para cualquier palabra que tenga una longitud de 3 caracteres. Pero ¿qué pasa con una palabra con 5 caracteres? O 10 caracteres? Ahora no funcionará ¿Qué ocurre si hay una forma en la que podemos cambiar dinámicamente el índice que agregamos para que cualquier palabra se devuelva en orden inverso?

Ingrese para el bucle.

for i in range(0,len(text)): lst.append(text[len(text)-count]) count += 1

En primer lugar, es necesario usar el in range() lugar de solo hacerlo, porque necesitamos iterar a través de los caracteres en la palabra, pero también necesitamos extraer el valor del índice de la palabra para que cambiemos el orden.

La primera parte del cuerpo de nuestro bucle for debe ser familiar. Es muy similar a

>>lst.append(word[..index..])

De hecho, el concepto de base es exactamente el mismo:

>>lst.append(text[..index..])

Entonces, ¿qué están haciendo todas las cosas en el medio?

Bueno, primero tenemos que anexar el índice de la última letra a nuestra lista, que es la longitud de la palabra, text , -1. A partir de ahora nos referiremos a él como l (t) -1

>>lst.append(text[len(text)-1])

Solo eso siempre obtendrá la última letra de nuestra palabra, y se lst a la lst , independientemente de la longitud de la palabra. Pero ahora que tenemos la última letra, que es l (t) - 1, necesitamos la penúltima letra, que es l (t) - 2, y así sucesivamente, hasta que no haya más caracteres para anexar a la lista . ¿Recuerdas nuestra variable de count desde arriba? Eso será util. Al usar un bucle for , podemos incrementar el valor del count por 1 a través de cada iteración, de modo que el valor que restamos aumente, hasta que el bucle for haya iterado a través de la palabra completa:

>>for i in range(0,len(text)): .. .. lst.append(text[len(text)-count]) .. count += 1

Ahora que tenemos el corazón de nuestra función, veamos lo que tenemos hasta ahora:

def reverse(text): lst = [] count = 1 for i in range(0,len(text)): lst.append(text[len(text)-count]) count += 1

¡Ya casi hemos terminado! En este momento, si tuviéramos que llamar a nuestra función con la palabra ''hola'', obtendríamos una lista que se parece a:

[''o'', ''l'', ''l'', ''e'', ​​''h'']

No queremos una lista, queremos una cadena. Podemos usar .join para eso:

def reverse(text): lst = [] count = 1 for i in range(0,len(text)): lst.append(text[len(text)-count]) count += 1 lst = ''''.join(lst) # join the letters together without a space return lst

Y eso es. Si llamamos a la palabra ''hola'' en reversa (), obtendríamos esto:

>>print reverse(''hello'') olleh

Obviamente, esto es mucho más código de lo que es necesario en una situación de la vida real. El uso de la función invertida o rebanada extendida sería la forma óptima de llevar a cabo esta tarea, pero tal vez haya alguna instancia en la que no funcionaría, y la necesitarías. De cualquier manera, pensé que lo compartiría con cualquiera que estuviera interesado.

Si ustedes tienen otras ideas, ¡me encantaría escucharlas!


def reverse(s): return "".join(s[i] for i in range(len(s)-1, -1, -1))


def reverse(text): a="" l=len(text) while(l>=1): a+=text[l-1] l-=1 return a

Acabo de concatenar la cadena a con los índices más altos de texto (que sigue decreciendo en 1 cada ciclo).


def reverseThatString(theString): reversedString = "" lenOfString = len(theString) for i,j in enumerate(theString): lenOfString -= 1 reversedString += theString[lenOfString] return reversedString


reduce(lambda x, y : y + x, "hello world")