¿Por qué no puedo ordenar esta lista?
Pregunta
statlist = [('abc',5,1), ('bzs',66,1), ... ]
sorted(statlist, key=lambda x: int(x[1]))
Quiero ordenarlo por el entero más grande a más pequeño. En este caso, 5 y 66. Pero no parece estar funcionando.
Solución
La función sorted
devuelve una lista new , por lo que deberá asignar los resultados de la función de esta manera:
new_list = sorted(statlist, key=lambda x: int(x[1]))
Otros consejos
Use el método .sort
para ordenar en el lugar:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist.sort(key=lambda x: int(x[1]))
Si desea utilizar ordenado
, reasigne la variable:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=lambda x: int(x[1]))
Para la ordenación descendente, use reverse
:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=lambda x: int(x[1]), reverse=True)
Entonces, será mejor que use itemgetter
en lugar de un lambda
:
import operator
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=operator.itemgetter(1), reverse=True)
Puede pasar, teclear y revertir a la función .sort
>>> x.sort(key=lambda x:x[1],reverse=True)
>>> x
[('bzs', 66, 1), ('abc', 5, 1)]
>>>
para uso de clasificación in situ
statlist.sort(key=lambda x: x[1])
para crear otra lista, con uso de datos ordenados
otherlist = sorted( statlist, key=lambda x: x[1] )
from operator import itemgetter
statlist = [('abc',5,1), ('bzs',66,1), ... ]
# statlist.sort modifiest the statlist, sorted returns a new one
# reverse puts the largest items to the front
statlist.sort(key=itemgetter(1), reverse=True)
En respuesta al comentario de alex de que pensaba que sorted () funcionaba "como la función de clasificación":
Si funcionó "como la función de clasificación", es poco probable que se haya puesto en la biblioteca.
En cualquier caso, no hay una función de clasificación ... se refiere al método de clasificación de los objetos de la lista.
Demostración simple usando el intérprete interactivo:
>>> alist = [3, 2, 1]; x = alist.sort(); print x; print alist
None
[1, 2, 3]
>>> alist = [3, 2, 1]; x = sorted(alist); print x; print alist
[1, 2, 3]
[3, 2, 1]
Aquí hay un consejo: busque patrones y similitudes, pero siempre verifique sus extrapolaciones intuitivas. Es posible que desee aplicar esas ideas a reverse
y reverse
.
>>> s = [('xyz', 8, 1), ('abc',5,1), ('bzs',66,1) ]
>>> s = sorted(s, key=lambda x: int(x[1]))
>>> s.reverse()
>>> print s
[('bzs', 66, 1), ('xyz', 8, 1), ('abc', 5, 1)]
Oye, cuando guardo algo en una matriz, no tiendo a preocuparme por el orden y, al final, uso sorted ()
, por ejemplo, así statlist = sorted ( statlist)
y, si lo desea, de mayor a menor statlist = sorted (statlist, reverse = True)
¡Esa es la forma sencilla de llegar de mayor a menor!
Código de ejemplo donde he usado esto (solo un extracto)
while i <= math.sqrt(intnum):
if (intnum % i) == 0:
numbers.insert(0,i)
numbers.insert(0,int(intnum/i))
print(i,":", int(intnum/i))
i += 1
numbers = sorted(numbers, reverse = True)