2012-04-02 13 views
19

¿Cuál es la diferencia entrepitón invertida (lista) y list.sort (inverso = True)

mylist = reversed(sorted(mylist)) 

vs

mylist = sorted(mylist, reverse=True) 

¿Por qué uno puede utilizar sobre el otro?

¿Qué hay de una especie estable en varias columnas como

mylist.sort(key=itemgetter(1)) 
mylist.sort(key=itemgetter(0)) 
mylist.reverse() 

es esto lo mismo que

mylist.sort(key=itemgetter(1), reverse=True) 
mylist.sort(key=itemgetter(0), reverse=True) 

?

Respuesta

17

Has golpeado en exactamente la diferencia. Dado que Timsort es estable, ordenar en el reverso o revertir el ordenamiento dejará los elementos sin clasificar en orden inverso.

>>> s = ((2, 3, 4), (1, 2, 3), (1, 2, 2)) 
>>> sorted(s, key=operator.itemgetter(0, 1), reverse=True) 
[(2, 3, 4), (1, 2, 3), (1, 2, 2)] 
>>> list(reversed(sorted(s, key=operator.itemgetter(0, 1)))) 
[(2, 3, 4), (1, 2, 2), (1, 2, 3)] 
+0

Gracias, para casos de uso general, probablemente no importe entonces. – Gladius

+1

Derecha. Si lo estás ordenando de todos modos, darán el mismo resultado. –

0

Obtiene una lista para ordenado(). pero invertido() devuelve un iterador

1

El invariante interesante es: list(reversed(sorted(reversed(data)))) == sorted(data, reverse=True).

Los otros encuestados tienen en claro que la diferencia tiene que ver con la estabilidad de clasificación, que conserva el orden de las mismas teclas. Y también ordenado() devolviendo una lista mientras invertido() devuelve un iterador.