¿Cuál es la diferencia entre `sorted (list)` vs `list.sort ()`?

list.sort() ordena la lista y guarda la lista ordenada, mientras que sorted(list) devuelve una copia ordenada de la lista, sin cambiar la lista original.

  • ¿Pero cuándo usar cuál?
  • ¿Y cuál es más rápido? ¿Y cuánto más rápido?
  • ¿Se pueden recuperar las posiciones originales de una lista después de list.sort() ?

sorted() devuelve una nueva lista ordenada, sin afectar a la lista original. list.sort() ordena la lista en el lugar , mutando los índices de la lista y devuelve None (como todas las operaciones en el lugar).

sorted() funciona en cualquier iterable, no solo en listas. Cadenas, tuplas, diccionarios (obtendrás las claves), generadores, etc., devolviendo una lista que contiene todos los elementos, ordenados.

  • Use list.sort() cuando quiera mutar la lista, sorted() cuando quiera recuperar un nuevo objeto ordenado. Utilice sorted() cuando quiera ordenar algo que sea iterable, no una lista todavía .

  • Para las listas, list.sort() es más rápido que sorted() porque no tiene que crear una copia. Para cualquier otro iterable, no tienes otra opción.

  • No, no puedes recuperar las posiciones originales. Una vez que haya llamado a list.sort() el pedido original desaparece.

¿Cuál es la diferencia entre sorted(list) vs list.sort() ?

  • list.sort muta la lista en el lugar y devuelve None
  • 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 de forma más rápida a medida que se escribe en C:

 def sorted(iterable, key=None): new_list = list(iterable) # make a new list new_list.sort(key=key) # sort it return new_list # return it 

¿Cuándo usar cuál?

  • Use list.sort cuando no desee conservar el orden 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 otros codifíquelo y mute, puede introducir errores donde se usa esa lista.)
  • Utilice sorted cuando desee conservar el orden de clasificación original o cuando desee crear una nueva lista que solo posea su código local.

¿Se pueden recuperar las posiciones originales de una lista después de list.sort ()?

No, a menos que usted mismo haya hecho una copia, esa información se pierde porque la clasificación se realiza en el lugar.

“¿Y cuál es más rápido? ¿Y cuánto más rápido?”

Para ilustrar la penalización de crear una nueva lista, use el módulo de timeit, aquí está nuestra configuración:

 import timeit setup = """ import random lists = [list(range(10000)) for _ in range(1000)] # list of lists for l in lists: random.shuffle(l) # shuffle each list shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time """ 

Y aquí están nuestros resultados para una lista de 10000 enteros organizados al azar, como podemos ver aquí, hemos refutado un mito más antiguo de la creación de listas :

Python 2.7

 >>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000) [3.75168503401801, 3.7473005310166627, 3.753129180986434] >>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000) [3.702025591977872, 3.709248117986135, 3.71071034099441] 

Python 3

 >>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000) [2.797430992126465, 2.796825885772705, 2.7744789123535156] >>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000) [2.675589084625244, 2.8019039630889893, 2.849375009536743] 

Después de algunos comentarios, decidí que otra prueba sería deseable con diferentes características. Aquí proporciono la misma lista aleatoriamente ordenada de 100,000 en longitud para cada iteración 1,000 veces.

 import timeit setup = """ import random random.seed(0) lst = list(range(100000)) random.shuffle(lst) """ 

Interpreto la diferencia de este tipo más grande proveniente de la copia mencionada por Martijn, pero no domina hasta el punto establecido en la respuesta más popular aquí, aquí el aumento en el tiempo es de solo un 10%.

 >>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000) [572.919036605, 573.1384446719999, 568.5923951] >>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000) [647.0584738299999, 653.4040515829997, 657.9457361929999] 

También corrí lo anterior en una clasificación mucho más pequeña, y vi que la nueva versión de copia sorted todavía toma aproximadamente un 2% más de tiempo de ejecución en una especie de 1000 de longitud.

Poke también corrió su propio código, aquí está el código:

 setup = ''' import random random.seed(12122353453462456) lst = list(range({length})) random.shuffle(lst) lists = [lst[:] for _ in range({repeats})] it = iter(lists) ''' t1 = 'l = next(it); l.sort()' t2 = 'l = next(it); sorted(l)' length = 10 ** 7 repeats = 10 ** 2 print(length, repeats) for t in t1, t2: print(t) print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats)) 

Encontró para el orden de 1000000 de longitud, (corrió 100 veces) un resultado similar, pero solo un aumento de aproximadamente el 5% en el tiempo, aquí está la salida:

 10000000 100 l = next(it); l.sort() 610.5015971539542 l = next(it); sorted(l) 646.7786222379655 

Conclusión:

Es probable que una lista de gran tamaño clasificada con sorted hacer una copia domine las diferencias, pero la ordenación misma domina la operación, y la organización de su código en torno a estas diferencias sería una optimización prematura. list.sort sorted cuando necesito una nueva lista ordenada de los datos, y usaría list.sort cuando necesito ordenar una lista en el lugar, y permitir que eso determine mi uso.

La principal diferencia es que sorted(some_list) devuelve una nueva list :

 a = [3, 2, 1] print sorted(a) # new list print a # is not modified 

y some_list.sort() , ordena la lista en su lugar :

 a = [3, 2, 1] print a.sort() # in place print a # it's modified 

Tenga en cuenta que dado que a.sort() no devuelve nada, print a.sort() no imprimirá None .


¿Se pueden recuperar las posiciones originales de una lista después de list.sort ()?

No, porque modifica la lista original.

La función .sort () almacena el valor de la nueva lista directamente en la variable de la lista; entonces la respuesta a tu tercera pregunta sería NO. Además, si lo hace utilizando ordenada (lista), entonces puede usarlo porque no está almacenado en la variable de lista. También a veces el método .sort () actúa como una función, o dice que toma argumentos en él.

Debe almacenar el valor de ordenado (lista) en una variable explícitamente.

También para el procesamiento de datos cortos, la velocidad no tendrá diferencia; pero para largas listas; debe utilizar directamente el método .sort () para un trabajo rápido; Pero nuevamente enfrentarás acciones irreversibles.

Aquí hay algunos ejemplos simples para ver la diferencia en la acción:

Vea la lista de números aquí:

 nums = [1, 9, -3, 4, 8, 5, 7, 14] 

Al llamar sorted en esta lista, sorted hará una copia de la lista. (Lo que significa que su lista original se mantendrá sin cambios).

Veamos.

 sorted(nums) 

devoluciones

 [-3, 1, 4, 5, 7, 8, 9, 14] 

Mirando los nums otra vez

 nums 

Vemos la lista original (sin alterar y NO ordenada). sorted no cambió la lista original

 [1, 2, -3, 4, 8, 5, 7, 14] 

Tomando la misma lista de nums y aplicando la función de sort en ella, cambiará la lista real.

Veamos.

Comenzando con nuestra lista de nums para asegurarnos, el contenido sigue siendo el mismo.

 nums [-3, 1, 4, 5, 7, 8, 9, 14] nums.sort() 

Ahora se modificó la lista de números originales y, al mirar los números, vemos que nuestra lista original ha cambiado y ahora está ordenada.

 nums [-3, 1, 2, 4, 5, 7, 8, 14] 

Nota: La diferencia más simple entre ordenar () y ordenar () es: sort () no devuelve ningún valor mientras que, ordenado () devuelve una lista iterable.

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 syntax del método sort () es:

 list.sort(key=..., reverse=...) 

Alternativamente, también puede usar la función incorporada de Python ordenada () para el mismo propósito. función ordenada retorno lista ordenada

  list=sorted(list, key=..., reverse=...)