si potrebbe scrivere una funzione per la chiave, restituendo un tuple
con ciascuna porzione di interesse ordinata per priorità.
def k(s):
m = {'I':0, 'R':1, 'H':2, 'E':3}
return m[s[3]], int(s[4:] or 0), -ord(s[0])
cols = [
'Aw H',
'Hm I1',
'Aw I2',
'Hm R',
'Aw R',
'Aw I1',
'Aw E',
'Hm I2',
'Hm H',
'Hm E',
]
Risultato:
>>> for i in sorted(cols, key=k):
... print(i)
...
Hm I1
Aw I1
Hm I2
Aw I2
Hm R
Aw R
Hm H
Aw H
Hm E
Aw E
Quando l'ordinamento tuple
s, i primi elementi vengono confrontati prima. Se sono uguali, gli tuple
vengono ordinati in base ai loro secondi elementi e così via. Questo è simile al modo in cui le parole ordinarie sono ordinate alfabeticamente.
Dal momento che prima vogliamo tutti gli elementi con 'I'
insieme, quindi 'R'
e così via, lo metteremo prima. Per fare ciò, definiamo un dizionario che assegna a ciascuna lettera la priorità desiderata. Quando cerchiamo quella lettera (il quarto carattere nella stringa, s[3]
) in quel dizionario, c'è la prima parte della chiave.
Successivamente, vogliamo il numero dopo quella lettera. A tal fine, utilizzeremo alcuni cortocircuiti per ottenere il quinto carattere e in avanti (s[4:]
) o, se non ce ne sono, uno 0
. Lo inviamo a int
, che valuterà il numero come numero da inserire '2'
dopo '12'
come dovrebbe essere.
Infine, se le prime due parti sono uguali, le voci verranno ordinate in base al loro primo carattere. Se questo fosse un tipo più semplice, potremmo semplicemente specificare reverse=True
. Se questa parte fosse un numero, potremmo semplicemente prendere il suo negativo. Trasformeremo quel personaggio in un numero con ord()
e poi prenderemo il negativo.
Il risultato è chiavi, ad esempio, per 'Aw I2'
.
Possibile duplicato di http://stackoverflow.com/questions/14208256/sort-a-list-with-a-custom-order-in-python o http://stackoverflow.com/questions/3624323/python-how-to-custom-order-a-list – SIslam