En Python, ¿cuál es la mejor manera de crear una nueva lista cuyos elementos son los mismos que los de alguna otra lista, pero en orden inverso? (No quiero modificar la lista existente en su lugar).
Aquí hay una solución que se me ha ocurrido:
new_list = list(reversed(old_list))
También es posible duplicar y old_list
luego invertir el duplicado en su lugar:
new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()
¿Hay una mejor opción que haya pasado por alto? Si no es así, ¿existe una razón de peso (como la eficiencia) para utilizar uno de los enfoques anteriores sobre el otro?
fuente
list(reversed(oldlist))
. Aparte de un menor micro-optimización, ¿hay alguna razón para preferir[::-1]
areversed()
?reversed
tiene una gran ventaja cuando no necesita la lista, porque no desperdicia memoria ni tiempo inicial para construirla. Pero cuando se hace necesario la lista, utilizando[::-1]
en lugar delist(reversed())
es análogo al uso de un[listcomp]
lugar delist(genexpr)
.[::-1]
significa eliminar el último elemento de una lista, en lugar de invertirlo.reversed(list)
declara exactamente lo que está haciendo; enuncia su intención, en el sentido de "lo explícito es mejor que lo implícito", "la legibilidad cuenta" y "escasa es mejor que densa".Ahora vamos
timeit
. Pista: Alex[::-1]
es el más rápido :)Actualizar: método de composición de lista agregado sugerido por inspectorG4dget. Dejaré que los resultados hablen por sí mismos.
fuente
[::-1]
Ajustes
Vale la pena proporcionar un punto de referencia / ajuste de referencia para los cálculos de tiempo de sdolan que muestran el rendimiento de 'invertido' sin la
list()
conversión a menudo innecesaria . Estalist()
operación agrega 26 usecs adicionales al tiempo de ejecución y solo es necesaria en el caso de que un iterador sea inaceptable.Resultados:
Cálculos:
Conclusiones:
La conclusión de estas pruebas
reversed()
es más rápida que la rebanada[::-1]
en 12,4 usecsfuente
''.join(reversed(['1','2','3']))
, el método de corte sigue siendo> 30% más rápido.