list.sort()
ordena la lista y reemplaza la lista original, mientras que sorted(list)
devuelve una copia ordenada de la lista, sin cambiar la lista original.
- ¿Cuándo se prefiere uno sobre el otro?
- ¿Cuál es más eficiente? ¿Por cuanto?
- ¿Se puede revertir una lista al estado no ordenado después de que
list.sort()
se haya realizado?
sorted()
a un argumento de cadena pero piensa que es una lista, obtiene un resultado de la lista, no una cadena :sorted("abcd", reverse=True)
da['d', 'c', 'b', 'a']
no"dcba"
Respuestas:
sorted()
devuelve una nueva lista ordenada, sin afectar la lista original.list.sort()
ordena la lista en el lugar , mutando los índices de la lista y devuelveNone
(como todas las operaciones en el lugar).sorted()
funciona en cualquier iterable, no solo en listas. Cadenas, tuplas, diccionarios (obtendrá las claves), generadores, etc., devolviendo una lista que contiene todos los elementos, ordenados.Úselo
list.sort()
cuando desee mutar la lista,sorted()
cuando desee recuperar un nuevo objeto ordenado. Úselosorted()
cuando desee ordenar algo que sea iterable, no una lista todavía .Para las listas,
list.sort()
es más rápido quesorted()
porque no tiene que crear una copia. Para cualquier otro iterable, no tienes otra opción.No, no puede recuperar las posiciones originales. Una vez que llamó,
list.sort()
el pedido original se ha ido.fuente
None
, es una señal de que las operaciones se realizan en su lugar, por eso, cuando desea imprimirlist.sort()
, devuelve None.list.sort
muta la lista en el lugar y devuelveNone
sorted
toma cualquier iterable y devuelve una nueva lista, ordenada.sorted
es equivalente a esta implementación de Python, pero la función incorporada de CPython debería ejecutarse considerablemente más rápido como está escrito en C:list.sort
cuando no desee retener el orden de clasificación original (por lo tanto, podrá reutilizar la lista en el lugar en la memoria) y cuando sea el único propietario de la lista (si la lista es compartida por otro código y usted mutarlo, podría introducir errores donde se usa esa lista).sorted
cuando desee conservar el orden de clasificación original o cuando desee crear una nueva lista que solo posea su código local.No, a menos que haya hecho una copia usted mismo, esa información se pierde porque la clasificación se realiza en el lugar.
Para ilustrar la penalización de crear una nueva lista, use el módulo timeit, aquí está nuestra configuración:
Y aquí están nuestros resultados para una lista de 10000 enteros dispuestos al azar, como podemos ver aquí, hemos refutado un mito de gastos de creación de listas más antiguo :
Python 2.7
Python 3
Después de algunos comentarios, decidí que sería deseable otra prueba con diferentes características. Aquí proporciono la misma lista ordenada aleatoriamente de 100,000 de longitud para cada iteración 1,000 veces.
Interpreto la diferencia de este tipo más grande que proviene de la copia mencionada por Martijn, pero no domina hasta el punto establecido en la respuesta más popular más antigua aquí, aquí el aumento en el tiempo es solo del 10%
También ejecuté lo anterior en un tipo mucho más pequeño, y vi que la nueva
sorted
versión de copia todavía tarda aproximadamente un 2% más de tiempo de ejecución en una especie de 1000 de longitud.Poke también ejecutó su propio código, aquí está el código:
Encontró para el orden de longitud 1000000, (corrió 100 veces) un resultado similar, pero solo un aumento del tiempo del 5%, aquí está el resultado:
Conclusión:
Una lista de gran tamaño que se ordena con
sorted
una copia probablemente dominará las diferencias, pero la ordenación en sí misma domina la operación, y organizar su código en torno a estas diferencias sería una optimización prematura. Lo usaríasorted
cuando necesite una nueva lista ordenada de los datos, y lo usarélist.sort
cuando necesite ordenar una lista en el lugar, y dejar que eso determine mi uso.fuente
sorted()
tiene que asignar un nuevo objeto de lista y copiar las referencias; El resto de las rutas de código son idénticas. Vea si puede ejecutar las mismas pruebas con listas más grandes. Compárelo con solo crear copias de listas y vea si puede replicar las diferencias que encontró, etc.La principal diferencia es que
sorted(some_list)
devuelve un nuevolist
:y
some_list.sort()
, ordena la lista en su lugar :Tenga en cuenta que como
a.sort()
no devuelve nada,print a.sort()
se imprimiráNone
.¿Se puede recuperar una lista de posiciones originales después de list.sort ()?
No, porque modifica la lista original.
fuente
print a.sort()
No imprime nada.None
, lo aclararé.La función .sort () almacena el valor de la nueva lista directamente en la variable de la lista; entonces la respuesta para su tercera pregunta sería NO. Además, si hace esto usando sorted (list), puede usarlo porque no está almacenado en la variable list. También a veces el método .sort () actúa como función, o dice que toma argumentos en él.
Debe almacenar el valor de sorted (list) en una variable explícitamente.
También para el procesamiento de datos cortos, la velocidad no tendrá diferencia; pero para largas listas; debe usar directamente el método .sort () para un trabajo rápido; pero nuevamente enfrentarás acciones irreversibles.
fuente
list.sort()
método ordena el objeto de la lista en el lugar..sort()
método toma argumentos y actúa como función. También lo llamamos método porque es un atributo de tipo de datos de lista.Aquí hay algunos ejemplos simples para ver la diferencia en acción:
Vea la lista de números aquí:
Al llamar
sorted
a esta lista,sorted
hará una copia de la lista. (Lo que significa que su lista original permanecerá sin cambios).Veamos.
devoluciones
Mirando de
nums
nuevoVemos la lista original (sin alterar y NO ordenada).
sorted
no cambió la lista originalTomar la misma
nums
lista y aplicarle lasort
función cambiará la lista real.Veamos.
Comenzando con nuestra
nums
lista para asegurarnos, el contenido sigue siendo el mismo.Ahora la lista de nums original ha cambiado y al mirar los nums vemos que nuestra lista original ha cambiado y ahora está ordenada.
fuente
sort () no devuelve ningún valor.
El método sort () simplemente ordena los elementos de una lista dada en un orden específico: ascendente o descendente sin devolver ningún valor.
La sintaxis del método sort () es:
fuente