Perché non riesco a ordinare questo elenco?
Domanda
statlist = [('abc',5,1), ('bzs',66,1), ... ]
sorted(statlist, key=lambda x: int(x[1]))
Voglio ordinarlo per intero dal più grande al più piccolo. In questo caso, 5 e 66. Ma non sembra funzionare.
Soluzione
La funzione ordinata
restituisce un nuovo elenco quindi sarà necessario assegnare i risultati della funzione in questo modo:
new_list = sorted(statlist, key=lambda x: int(x[1]))
Altri suggerimenti
Utilizza il metodo .sort
per l'ordinamento sul posto:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist.sort(key=lambda x: int(x[1]))
Se si desidera utilizzare ordinato
, riassegnare la variabile:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=lambda x: int(x[1]))
Per l'ordinamento decrescente, utilizzare reverse
:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=lambda x: int(x[1]), reverse=True)
Quindi, è meglio usare itemgetter
invece di lambda
:
import operator
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=operator.itemgetter(1), reverse=True)
È possibile passare, digitare e invertire la funzione .sort
>>> x.sort(key=lambda x:x[1],reverse=True)
>>> x
[('bzs', 66, 1), ('abc', 5, 1)]
>>>
per uso di ordinamento sul posto
statlist.sort(key=lambda x: x[1])
per creare un altro elenco, con dati ordinati utilizzare
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)
In risposta al commento di alex che pensava che sort () funzionasse " come la funzione sort " ;:
Se ha funzionato "come la funzione di ordinamento", è improbabile che sia stato inserito nella libreria.
In ogni caso, non esiste alcun tipo di funzione ... fai riferimento al metodo degli oggetti dell'elenco.
Dimostrazione semplice usando l'interprete interattivo:
>>> 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]
Ecco un consiglio: cerca modelli e somiglianze, ma verifica sempre le tue estrapolazioni intuitive. Potresti applicare queste idee a reverse
e 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)]
Ehi ogni volta che sto salvando qualcosa su un array non tendo a preoccuparmi dell'ordine e alla fine uso sort ()
ad esempio come questo statlist = ordinato ( statlist)
e se lo volevi dal più grande al più piccolo statlist = ordinato (statlist, reverse = True)
Questo è il modo semplice di diventare il più grande al più piccolo!
Codice di esempio in cui l'ho usato (solo un estratto)
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)