@kdlannoy Según la página vinculada en la respuesta, "En comparación con el corte extendido, como el rango (1,4) [:: - 1], el reverso () es más fácil de leer, se ejecuta más rápido y utiliza sustancialmente menos memoria. "
Jim Oldfield
55
Cuando probé este corte fue aproximadamente el doble de rápido (al invertir una lista de elementos de 10k y crear una lista a partir de ella). Sin embargo, no probé el consumo de memoria. reversesin embargo, podría ser más rápido si no necesita emitir para listar después.
Dakkaron el
55
Vale la pena señalar que esto no es lo mismo que revertir ([1,2,3]), nb la 'd' al final ... que es una de las otras respuestas a continuación, que hace esto en el lugar, mientras que esto devuelve Un iterador.
Luciano
14
¿Por qué usar en reversed()lugar de rebanar? Lea el Zen de Python, regla número 7: ¡la legibilidad cuenta!
Funciona para cualquier interable, no solo para listas. La desventaja es que no está en su lugar.
Suiza
66
@Tim devuelve una rebanada, por lo que no cambia el contenido de la lista reales
FORTRAN
12
@lunixbochs invertido devuelve un iterador y no una lista en Python 3.
Suiza
2
a menos que se encapsule de forma natural dentro de la matriz
Einar Petersen
2
Estoy de acuerdo con @Swiss. +1 ya que la pregunta era que necesitaba tener los elementos de una matriz, pero desde el final hasta el principio. - reverseddevuelve un listreverseiteratorobjeto (Python 2.7.x), que luego debe iterarse - el corte inverso devuelve una lista / tupla / str invertida (dependiendo de lo que esté cortando). @Einar Petersen que está invirtiendo una cadena, por lo que la salida es correcta. Prueba:co2=['ae','ad','ac','ab','aa','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'] >>> co2[::-1]
Aaron Newton
368
>>> L =[0,10,20,40]>>> L.reverse()>>> L
[40,20,10,0]
El uso de segmentación, por ejemplo, array = array [:: - 1], es un buen truco y muy pitónico, pero quizás un poco oscuro para los novatos. Usar el método reverse () es una buena manera de ir en la codificación del día a día porque es fácil de leer.
Sin embargo, si necesita revertir una lista en el lugar como en una pregunta de entrevista, es probable que no pueda utilizar métodos integrados como estos. El entrevistador observará cómo aborda el problema en lugar de la profundidad del conocimiento de Python, se requiere un enfoque algorítmico. El siguiente ejemplo, utilizando un intercambio clásico, podría ser una forma de hacerlo:
def reverse_in_place(lst):# Declare a function
size = len(lst)# Get the length of the sequence
hiindex = size -1
its = size/2# Number of iterations requiredfor i in xrange(0, its):# i is the low index pointer
temp = lst[hiindex]# Perform a classic swap
lst[hiindex]= lst[i]
lst[i]= temp
hiindex -=1# Decrement the high index pointerprint"Done!"# Now test it!!
array =[2,5,8,9,12,19,25,27,32,60,65,1,7,24,124,654]print array # Print the original sequence
reverse_in_place(array)# Call the function passing the listprint array # Print reversed list**The result:**[2,5,8,9,12,19,25,27,32,60,65,1,7,24,124,654]Done![654,124,24,7,1,65,60,32,27,25,19,12,9,8,5,2]
Tenga en cuenta que esto no funcionará en Tuplas o secuencias de cadenas, porque las cadenas y las tuplas son inmutables, es decir, no puede escribir en ellas para cambiar elementos.
El intercambio clásico podría hacerse a través de lst[hiindex], lst[i] = lst[i], lst[hiindex], creo ... ;-)
Samoth
@Samoth Esa sintaxis no es tan clara y el comportamiento no es exactamente obvio. Los pasos distintos tienen más sentido.
Anthony
¿Por qué la gente dice que cosas como array [:: - 1] son pitónicas? El zen de Python nos enseña que explícito es mejor que implícito y que la legibilidad cuenta. Cosas así no son explícitas y legibles en absoluto.
k4ppa
1
@ k4ppa: array[::-1]es perfectamente legible y perfectamente explícito si conoce Python . "Legible" no significa "alguien que nunca antes haya usado el corte de Python debe poder leerlo"; el [::-1]corte inverso es un idioma ridículamente común en Python (lo encontrarás todo el tiempo en el código existente), y es perfectamente legible si usas Python regularmente . Claro, first10 = [], for i in range(10): first10.append(array[i])es clara y explícita, pero eso no significa que sea mejor que first10 = array[:10].
ShadowRanger
19
Creo que (al contrario de algunas otras sugerencias) l.reverse()es, con mucho, la forma más rápida de revertir una larga lista en Python 3 y 2. Me interesaría saber si otros pueden replicar estos tiempos.
l[::-1]es probablemente más lento porque copia la lista antes de revertirla. Agregar la list()llamada alrededor del iterador realizado por reversed(l)debe agregar algunos gastos generales. Por supuesto, si desea una copia de la lista o un iterador, use esos métodos respectivos, pero si desea simplemente revertir la lista, entonces l.reverse()parece ser la forma más rápida.
Las funciones
def rev_list1(l):return l[::-1]def rev_list2(l):return list(reversed(l))def rev_list3(l):
l.reverse()return l
list.reversees el más rápido, ya que se invierte en su lugar
warvariuc
Estás en lo correcto list.reverse()es más rápido, pero estás penalizando reversed(que se usa mejor cuando no quieres una nueva list, solo para iterar una existente listen orden inverso sin mutar el original), y el corte (que también evita mutar el original list, y normalmente es más rápido que reversedcuando la entrada es pequeña). Sí, si no necesita la copia, cualquier cosa que copie es más costosa, pero muchas veces, no desea mutar el valor original.
ShadowRanger
Parece que reversedaún pierdelist.reverse() , pero dado que no muta la entrada list, es mejor en muchos casos. La pérdida reversedes pequeña (~ 1/6 más larga que list.reverse()).
Estaba buscando cómo hacer eso sin usar la función inversa. Gracias.
Bernard 'Beta Berlin' Parah
O para invertir en su lugar, use list = list.reverse ()
SimonM
6
Resumen de métodos con explicación y resultados de tiempo
Hay varias buenas respuestas, pero dispersas y la mayoría no indican las diferencias fundamentales de cada enfoque.
En general, es mejor usar funciones / métodos integrados para revertir, como con casi cualquier función. En este caso, son aproximadamente de 2 a 8 veces más rápidos en listas cortas (10 elementos) y hasta ~ 300 + veces más rápido en listas largas en comparación con un medio de indexación creado manualmente. Esto tiene sentido ya que tienen expertos que los crean, el escrutinio y la optimización. También son menos propensos a defectos y más propensos a manejar casos de bordes y esquinas.
Considere también si desea:
Invertir una lista existente en el lugar
La mejor solución es el object.reverse()método.
Cree un iterador del reverso de la lista (porque lo va a alimentar a un ciclo for, un generador, etc.)
La mejor solución es la reversed(object)que crea el iterador
o cree una copia completa que esté en el orden inverso
La mejor solución es usar rebanadas con un tamaño de paso de -1: object[::-1]
Script de prueba
Aquí está el comienzo de mi script de prueba para los métodos cubiertos. Ponga todos los fragmentos de código en esta respuesta para crear un script que ejecute todas las diferentes formas de invertir una lista y el tiempo de cada una (el resultado se muestra en la última sección).
from timeit import timeit
from copy import copy
def time_str_ms(t):return'{0:8.2f} ms'.format(t *1000)
Método 1: Invierta en su lugar con obj.reverse ()
Si el objetivo es simplemente invertir el orden de los elementos en una lista existente, sin recorrerlos ni obtener una copia para trabajar, use el <list>.reverse() función Ejecute esto directamente en un objeto de lista, y el orden de todos los elementos se invertirá:
Tenga en cuenta que lo siguiente revertirá la variable original que se proporciona, aunque también devuelve la lista revertida. es decir, puede crear una copia utilizando esta función de salida. Por lo general, no haría una función para esto, pero lo hice para usar el código de sincronización al final.
Probaremos el rendimiento de estas dos formas: primero simplemente invirtiendo una lista en el lugar (cambia la lista original), y luego copiando la lista y luego invirtiéndola.
def rev_in_place(mylist):
mylist.reverse()return mylist
def rev_copy_reverse(mylist):
a = copy(mylist)
a.reverse()return a
Método 2: Invierta una lista usando rebanadas obj[::-1]
El método de división de índice incorporado le permite hacer una copia de parte de cualquier objeto indexado.
No afecta el objeto original.
Construye una lista completa, no un iterador
La sintaxis genérica es: <object>[first_index:last_index:step]. Para explotar rebanar para crear una sencilla lista invertida, utilice: <list>[::-1]. Al dejar una opción vacía, los establece en los valores predeterminados del primer y último elemento del objeto (se invierte si el tamaño del paso es negativo).
La indexación permite utilizar números negativos, que cuentan desde el final del índice del objeto hacia atrás (es decir, -2 es el penúltimo elemento). Cuando el tamaño del paso es negativo, comenzará con el último elemento e indexará hacia atrás en esa cantidad. Hay cierta lógica de inicio y fin asociada con esto que se ha optimizado.
def rev_slice(mylist):
a = mylist[::-1]return a
Método 3: Invierta una lista con la reversed(obj)función iteradora
Hay una reversed(indexed_object)función:
Esto crea un iterador de índice inverso, no una lista. Excelente si lo está alimentando a un bucle para un mejor rendimiento en listas grandes
Esto crea una copia y no afecta el objeto original.
Pruebe con un iterador sin formato y creando una lista desde el iterador.
def reversed_iterator(mylist):
a = reversed(mylist)return a
def reversed_with_list(mylist):
a = list(reversed(mylist))return a
Método 4: Lista inversa con indexación personalizada / manual
Como mostrará el momento, crear sus propios métodos de indexación es una mala idea. Utilice los métodos integrados a menos que necesite hacer algo realmente personalizado.
Dicho esto, no hay una penalización enorme con tamaños de lista más pequeños, pero cuando se amplía la penalización se vuelve tremenda. Estoy seguro de que mi código a continuación podría optimizarse, pero seguiré con los métodos integrados.
def rev_manual_pos_gen(mylist):
max_index = len(mylist)-1return[ mylist[max_index - index]for index in range(len(mylist))]def rev_manual_neg_gen(mylist):## index is 0 to 9, but we need -1 to -10return[ mylist[-index-1]for index in range(len(mylist))]def rev_manual_index_loop(mylist):
a =[]
reverse_index = len(mylist)-1for index in range(len(mylist)):
a.append(mylist[reverse_index - index])return a
def rev_manual_loop(mylist):
a =[]
reverse_index = len(mylist)for index, _ in enumerate(mylist):
reverse_index -=1
a.append(mylist[reverse_index])return a
Momento de cada método
A continuación se muestra el resto del guión para cronometrar cada método de inversión. Muestra marcha atrás en su lugar obj.reverse()y crea elreversed(obj) iterador son siempre las más rápidas, mientras que el uso de sectores es la forma más rápida de crear una copia.
¡También demuestra que no debe intentar crear una forma de hacerlo por su cuenta a menos que tenga que hacerlo!
loops_to_test =100000
number_of_items =10
list_to_reverse = list(range(number_of_items))if number_of_items <15:print("a: {}".format(list_to_reverse))print('Loops: {:,}'.format(loops_to_test))# List of the functions we want to test with the timer, in print order
fcns =[rev_in_place, reversed_iterator, rev_slice, rev_copy_reverse,
reversed_with_list, rev_manual_pos_gen, rev_manual_neg_gen,
rev_manual_index_loop, rev_manual_loop]
max_name_string = max([ len(fcn.__name__)for fcn in fcns ])for fcn in fcns:
a = copy(list_to_reverse)# copy to start fresh each loop
out_str =' | out = {}'.format(fcn(a))if number_of_items <15else''# Time in ms for the given # of loops on this fcn
time_str = time_str_ms(timeit(lambda: fcn(a), number=loops_to_test))# Get the output string for this function
fcn_str ='{}(a):'.format(fcn.__name__)# Add the correct string length to accommodate the maximum fcn name
format_str ='{{fx:{}s}} {{time}}{{rev}}'.format(max_name_string +4)print(format_str.format(fx=fcn_str, time=time_str, rev=out_str))
Resultados de tiempo
Los resultados muestran que el escalado funciona mejor con los métodos integrados más adecuados para una tarea determinada. En otras palabras, a medida que aumenta el recuento de elementos del objeto, los métodos integrados comienzan a tener resultados de rendimiento muy superiores.
También es mejor usar el mejor método incorporado que logra directamente lo que necesita que unir las cosas. es decir, el corte es mejor si necesita una copia de la lista invertida: es más rápido que crear una lista desde la reversed()función, y más rápido que hacer una copia de la lista y luego hacer un in situ obj.reverse(). Pero si alguno de esos métodos es realmente todo lo que necesita, son más rápidos, pero nunca más del doble de la velocidad. Mientras tanto, los métodos manuales personalizados pueden llevar órdenes de magnitud más largas, especialmente con listas muy grandes.
Para el escalado, con una lista de 1000 elementos, la reversed(<list>)llamada a la función tarda ~ 30 ms para configurar el iterador, la inversión en el lugar tarda solo ~ 55 ms, el uso del método de división demora ~ 210 ms para crear una copia de la lista inversa completa, pero ¡El método manual más rápido que hice tomó ~ 8400 ms!
Con 2 artículos en la lista:
a:[0,1]Loops:100,000
rev_in_place(a):24.70 ms | out =[1,0]
reversed_iterator(a):30.48 ms | out =<list_reverseiterator object at 0x0000020242580408>
rev_slice(a):31.65 ms | out =[1,0]
rev_copy_reverse(a):63.42 ms | out =[1,0]
reversed_with_list(a):48.65 ms | out =[1,0]
rev_manual_pos_gen(a):98.94 ms | out =[1,0]
rev_manual_neg_gen(a):88.11 ms | out =[1,0]
rev_manual_index_loop(a):87.23 ms | out =[1,0]
rev_manual_loop(a):79.24 ms | out =[1,0]
Con 10 artículos en la lista:
rev_in_place(a):23.39 ms | out =[9,8,7,6,5,4,3,2,1,0]
reversed_iterator(a):30.23 ms | out =<list_reverseiterator object at 0x00000290A3CB0388>
rev_slice(a):36.01 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_copy_reverse(a):64.67 ms | out =[9,8,7,6,5,4,3,2,1,0]
reversed_with_list(a):50.77 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_pos_gen(a):162.83 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_neg_gen(a):167.43 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_index_loop(a):152.04 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_loop(a):183.01 ms | out =[9,8,7,6,5,4,3,2,1,0]
Y con 1000 artículos en la lista:
rev_in_place(a):56.37 ms
reversed_iterator(a):30.47 ms
rev_slice(a):211.42 ms
rev_copy_reverse(a):295.74 ms
reversed_with_list(a):418.45 ms
rev_manual_pos_gen(a):8410.01 ms
rev_manual_neg_gen(a):11054.84 ms
rev_manual_index_loop(a):10543.11 ms
rev_manual_loop(a):15472.66 ms
Usando la lógica de la vieja escuela para practicar para entrevistas.
Intercambiando números de adelante hacia atrás. Usando dos punterosindex[0] and index[last]
def reverse(array):
n = array
first =0
last = len(array)-1while first < last:
holder = n[first]
n[first]= n[last]
n[last]= holder
first +=1
last -=1return n
input ->[-1,1,2,3,4,5,6]
output ->[6,1,2,3,4,5,-1]
Hablando estrictamente, la pregunta no es cómo devolver una lista en reversa sino cómo revertir una lista con un nombre de lista de ejemplo array.
Para revertir una lista llamada "array"use array.reverse().
El método de corte increíblemente útil como se describe también se puede usar para revertir una lista en su lugar definiendo la lista como una modificación en rodajas de sí misma usando array = array[::-1] .
Con una cantidad mínima de funciones incorporadas, suponiendo que sea la configuración de la entrevista
array =[1,2,3,4,5,6,7,8]
inverse =[]#create container for inverse array
length = len(array)#to iterate later, returns 8
counter = length -1#because the 8th element is on position 7 (as python starts from 0)for i in range(length):
inverse.append(array[counter])
counter -=1print(inverse)
Siempre puede tratar la lista como una pila simplemente sacando los elementos de la parte superior de la pila desde el final de la lista. De esta forma, aprovecha las características de primero en último lugar de una pila. Por supuesto que estás consumiendo la primera matriz. Me gusta este método porque es bastante intuitivo porque ves que una lista se consume desde el back-end mientras que la otra se construye desde el front-end.
>>> l =[1,2,3,4,5,6]; nl=[]>>>while l:
nl.append(l.pop())>>>print nl
[6,5,4,3,2,1]
Aquí hay una manera de evaluar perezosamente el reverso usando un generador :
def reverse(seq):for x in range(len(seq),-1,-1):#Iterate through a sequence starting from -1 and increasing by -1.yield seq[x]#Yield a value to the generator
Usando la función incorporada: reversed_array = array.reverse()
La tercera función realmente invirtió el objeto de la lista en su lugar. Eso significa que no se mantiene una copia de los datos prístinos. Este es un buen enfoque si no desea mantener la versión anterior. Pero no parece ser una solución si quieres la versión original e inversa.
Esta solución es aproximadamente 4.5k veces más lenta que l[::-1], y al mismo tiempo, mucho menos legible. La programación funcional en Python es tristemente bastante lenta.
reverse
sin embargo, podría ser más rápido si no necesita emitir para listar después.reversed()
lugar de rebanar? Lea el Zen de Python, regla número 7: ¡la legibilidad cuenta!La sintaxis extendida de la porción se explica bien en la entrada de Novedades de Python para su lanzamiento
2.3.5
Por pedido especial en un comentario, esta es la documentación de corte más actualizada .
fuente
reversed
devuelve unlistreverseiterator
objeto (Python 2.7.x), que luego debe iterarse - el corte inverso devuelve una lista / tupla / str invertida (dependiendo de lo que esté cortando). @Einar Petersen que está invirtiendo una cadena, por lo que la salida es correcta. Prueba:co2=['ae','ad','ac','ab','aa','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'] >>> co2[::-1]
O
fuente
L=L[::-1]
invertir la lista; de lo contrario, solo devolverá los valores a la inversab = l[-n:] b.reverse() l = b + l[:len(l) - n]
Esto es para duplicar la lista:
Esto es para revertir la lista en el lugar:
fuente
Creo que la mejor manera de revertir una lista en Python es hacer:
El trabajo está hecho, y ahora tienes una lista invertida.
fuente
Para invertir la misma lista use:
Para asignar una lista invertida a otra lista, use:
fuente
El uso de segmentación, por ejemplo, array = array [:: - 1], es un buen truco y muy pitónico, pero quizás un poco oscuro para los novatos. Usar el método reverse () es una buena manera de ir en la codificación del día a día porque es fácil de leer.
Sin embargo, si necesita revertir una lista en el lugar como en una pregunta de entrevista, es probable que no pueda utilizar métodos integrados como estos. El entrevistador observará cómo aborda el problema en lugar de la profundidad del conocimiento de Python, se requiere un enfoque algorítmico. El siguiente ejemplo, utilizando un intercambio clásico, podría ser una forma de hacerlo:
Tenga en cuenta que esto no funcionará en Tuplas o secuencias de cadenas, porque las cadenas y las tuplas son inmutables, es decir, no puede escribir en ellas para cambiar elementos.
fuente
lst[hiindex], lst[i] = lst[i], lst[hiindex]
, creo ... ;-)array[::-1]
es perfectamente legible y perfectamente explícito si conoce Python . "Legible" no significa "alguien que nunca antes haya usado el corte de Python debe poder leerlo"; el[::-1]
corte inverso es un idioma ridículamente común en Python (lo encontrarás todo el tiempo en el código existente), y es perfectamente legible si usas Python regularmente . Claro,first10 = []
,for i in range(10): first10.append(array[i])
es clara y explícita, pero eso no significa que sea mejor quefirst10 = array[:10]
.Creo que (al contrario de algunas otras sugerencias)
l.reverse()
es, con mucho, la forma más rápida de revertir una larga lista en Python 3 y 2. Me interesaría saber si otros pueden replicar estos tiempos.l[::-1]
es probablemente más lento porque copia la lista antes de revertirla. Agregar lalist()
llamada alrededor del iterador realizado porreversed(l)
debe agregar algunos gastos generales. Por supuesto, si desea una copia de la lista o un iterador, use esos métodos respectivos, pero si desea simplemente revertir la lista, entoncesl.reverse()
parece ser la forma más rápida.Las funciones
Lista
Python 3.5 tiempos
Python 2.7 tiempos
fuente
list.reverse
es el más rápido, ya que se invierte en su lugarlist.reverse()
es más rápido, pero estás penalizandoreversed
(que se usa mejor cuando no quieres una nuevalist
, solo para iterar una existentelist
en orden inverso sin mutar el original), y el corte (que también evita mutar el originallist
, y normalmente es más rápido quereversed
cuando la entrada es pequeña). Sí, si no necesita la copia, cualquier cosa que copie es más costosa, pero muchas veces, no desea mutar el valor original.reversed
aún pierdelist.reverse()
, pero dado que no muta la entradalist
, es mejor en muchos casos. La pérdidareversed
es pequeña (~ 1/6 más larga quelist.reverse()
).fuente
Con
reversed
ylist
:fuente
fuente
El uso de invertido (matriz) sería probablemente la mejor ruta.
Si necesita comprender cómo podría implementar esto sin utilizar el incorporado
reversed
.Esto debería llevar tiempo O (N).
fuente
Resumen de métodos con explicación y resultados de tiempo
Hay varias buenas respuestas, pero dispersas y la mayoría no indican las diferencias fundamentales de cada enfoque.
En general, es mejor usar funciones / métodos integrados para revertir, como con casi cualquier función. En este caso, son aproximadamente de 2 a 8 veces más rápidos en listas cortas (10 elementos) y hasta ~ 300 + veces más rápido en listas largas en comparación con un medio de indexación creado manualmente. Esto tiene sentido ya que tienen expertos que los crean, el escrutinio y la optimización. También son menos propensos a defectos y más propensos a manejar casos de bordes y esquinas.
Considere también si desea:
object.reverse()
método.reversed(object)
que crea el iteradorobject[::-1]
Script de prueba
Aquí está el comienzo de mi script de prueba para los métodos cubiertos. Ponga todos los fragmentos de código en esta respuesta para crear un script que ejecute todas las diferentes formas de invertir una lista y el tiempo de cada una (el resultado se muestra en la última sección).
Método 1: Invierta en su lugar con obj.reverse ()
Si el objetivo es simplemente invertir el orden de los elementos en una lista existente, sin recorrerlos ni obtener una copia para trabajar, use el
<list>.reverse()
función Ejecute esto directamente en un objeto de lista, y el orden de todos los elementos se invertirá:Tenga en cuenta que lo siguiente revertirá la variable original que se proporciona, aunque también devuelve la lista revertida. es decir, puede crear una copia utilizando esta función de salida. Por lo general, no haría una función para esto, pero lo hice para usar el código de sincronización al final.
Probaremos el rendimiento de estas dos formas: primero simplemente invirtiendo una lista en el lugar (cambia la lista original), y luego copiando la lista y luego invirtiéndola.
Método 2: Invierta una lista usando rebanadas
obj[::-1]
El método de división de índice incorporado le permite hacer una copia de parte de cualquier objeto indexado.
La sintaxis genérica es:
<object>[first_index:last_index:step]
. Para explotar rebanar para crear una sencilla lista invertida, utilice:<list>[::-1]
. Al dejar una opción vacía, los establece en los valores predeterminados del primer y último elemento del objeto (se invierte si el tamaño del paso es negativo).La indexación permite utilizar números negativos, que cuentan desde el final del índice del objeto hacia atrás (es decir, -2 es el penúltimo elemento). Cuando el tamaño del paso es negativo, comenzará con el último elemento e indexará hacia atrás en esa cantidad. Hay cierta lógica de inicio y fin asociada con esto que se ha optimizado.
Método 3: Invierta una lista con la
reversed(obj)
función iteradoraHay una
reversed(indexed_object)
función:Pruebe con un iterador sin formato y creando una lista desde el iterador.
Método 4: Lista inversa con indexación personalizada / manual
Como mostrará el momento, crear sus propios métodos de indexación es una mala idea. Utilice los métodos integrados a menos que necesite hacer algo realmente personalizado.
Dicho esto, no hay una penalización enorme con tamaños de lista más pequeños, pero cuando se amplía la penalización se vuelve tremenda. Estoy seguro de que mi código a continuación podría optimizarse, pero seguiré con los métodos integrados.
Momento de cada método
A continuación se muestra el resto del guión para cronometrar cada método de inversión. Muestra marcha atrás en su lugar
obj.reverse()
y crea elreversed(obj)
iterador son siempre las más rápidas, mientras que el uso de sectores es la forma más rápida de crear una copia.¡También demuestra que no debe intentar crear una forma de hacerlo por su cuenta a menos que tenga que hacerlo!
Resultados de tiempo
Los resultados muestran que el escalado funciona mejor con los métodos integrados más adecuados para una tarea determinada. En otras palabras, a medida que aumenta el recuento de elementos del objeto, los métodos integrados comienzan a tener resultados de rendimiento muy superiores.
También es mejor usar el mejor método incorporado que logra directamente lo que necesita que unir las cosas. es decir, el corte es mejor si necesita una copia de la lista invertida: es más rápido que crear una lista desde la
reversed()
función, y más rápido que hacer una copia de la lista y luego hacer un in situobj.reverse()
. Pero si alguno de esos métodos es realmente todo lo que necesita, son más rápidos, pero nunca más del doble de la velocidad. Mientras tanto, los métodos manuales personalizados pueden llevar órdenes de magnitud más largas, especialmente con listas muy grandes.Para el escalado, con una lista de 1000 elementos, la
reversed(<list>)
llamada a la función tarda ~ 30 ms para configurar el iterador, la inversión en el lugar tarda solo ~ 55 ms, el uso del método de división demora ~ 210 ms para crear una copia de la lista inversa completa, pero ¡El método manual más rápido que hice tomó ~ 8400 ms!Con 2 artículos en la lista:
Con 10 artículos en la lista:
Y con 1000 artículos en la lista:
fuente
Si desea almacenar los elementos de la lista invertida en alguna otra variable, puede usar
revArray = array[::-1]
orevArray = list(reversed(array))
.Pero la primera variante es un poco más rápida:
Salida:
fuente
timeit
.VALORES ORGANIZADORES:
En Python, el orden de las listas también se puede manipular ordenando , organizando sus variables en orden numérico / alfabético:
Temporalmente:
Permanente:
Puede ordenar con la bandera "reverse = True" :
SIN ORGANIZAR
Tal vez no desee ordenar los valores, sino que solo invierta los valores. Entonces podemos hacerlo así:
** Los números tienen prioridad sobre el alfabeto en el orden de inclusión. La organización de los valores de Python es asombrosa.
fuente
Usando algo de lógica
Usando la lógica de la vieja escuela para practicar para entrevistas.
fuente
También puede usar el complemento bit a bit del índice de matriz para recorrer la matriz a la inversa:
Hagas lo que hagas, no lo hagas de esta manera.
fuente
Usar la comprensión de la lista:
fuente
Otra solución sería usar numpy.flip para esto
fuente
Hablando estrictamente, la pregunta no es cómo devolver una lista en reversa sino cómo revertir una lista con un nombre de lista de ejemplo
array
.Para revertir una lista llamada
"array"
usearray.reverse()
.El método de corte increíblemente útil como se describe también se puede usar para revertir una lista en su lugar definiendo la lista como una modificación en rodajas de sí misma usando
array = array[::-1]
.fuente
array[:] = array[::-1]
fuente
Con una cantidad mínima de funciones incorporadas, suponiendo que sea la configuración de la entrevista
fuente
La traducción más directa de su requerimiento a Python es esta
for
declaración:Esto es bastante críptico pero puede ser útil.
fuente
fuente
//
operador de división de piso.Siempre puede tratar la lista como una pila simplemente sacando los elementos de la parte superior de la pila desde el final de la lista. De esta forma, aprovecha las características de primero en último lugar de una pila. Por supuesto que estás consumiendo la primera matriz. Me gusta este método porque es bastante intuitivo porque ves que una lista se consume desde el back-end mientras que la otra se construye desde el front-end.
fuente
fuente
utilizar
fuente
Aquí hay una manera de evaluar perezosamente el reverso usando un generador :
Ahora repita de esta manera:
Si necesitas una lista:
fuente
Hay 3 métodos para obtener la lista invertida:
Método de corte 1:
reversed_array = array[-1::-1]
Método de corte 2:
reversed_array2 = array[::-1]
Usando la función incorporada:
reversed_array = array.reverse()
La tercera función realmente invirtió el objeto de la lista en su lugar. Eso significa que no se mantiene una copia de los datos prístinos. Este es un buen enfoque si no desea mantener la versión anterior. Pero no parece ser una solución si quieres la versión original e inversa.
fuente
fuente
l[::-1]
, y al mismo tiempo, mucho menos legible. La programación funcional en Python es tristemente bastante lenta.