2010-08-06 20 views
69

So che sembra banale ma non mi sono reso conto che la funzione sort() di Python era strana. Ho una lista di "numeri" che sono effettivamente in forma di stringa, quindi prima li converto in int, quindi cerco un ordinamento.Come ordinare una lista numericamente?

list1=["1","10","3","22","23","4","2","200"] 
for item in list1: 
    item=int(item) 

list1.sort() 
print list1 

Mi dà:

['1', '10', '2', '200', '22', '23', '3', '4'] 

Quello che voglio è

['1','2','3','4','10','22','23','200'] 

Ho guardato intorno per alcuni degli algoritmi di ordinamento associati insiemi numerici, ma quelli che ho trovato tutto comportano l'ordinamento di set alfanumerici.

So che questo è probabilmente un problema facile soluzione ma Google e il mio libro di testo non offrono nulla di più o meno utili rispetto alla funzione .sort().

+7

Nota che il tuo ciclo for non fa quello che sospetto che tu pensi che faccia. – deinst

+1

In nessun momento hai aggiornato 'lista1'. Cosa ti ha fatto pensare che 'list' fosse in aggiornamento? –

+0

Il problema simile si alza quando list1 = ['1', '1.10', '1.11', '1.1', '1.2'] viene fornito come input. Invece di ottenere output come ['1', '1.1', '1.2', '1.10', '1.11'], sto ricevendo ['1', '1.1', '1.10', '1.11', '1.2' ] – sathish

risposta

127

Non hai effettivamente convertito le corde a int. O meglio, l'hai fatto, ma poi non hai fatto nulla con i risultati. Quello che vuoi è:

list1 = ["1","10","3","22","23","4","2","200"] 
list1 = [int(x) for x in list1] 
list1.sort() 

Tuttavia, pitone rende ancora più facile per voi: sorta prende un parametro, chiave denominata, che è una funzione che viene chiamato su ogni elemento prima di essere confrontato (ma senza modificare la lista)

list1 = ["1","10","3","22","23","4","2","200"] 
# call int(x) on each element before comparing it 
list1.sort(key=int) 
+6

quando provo key = int in 2.7 Ottiene None – KI4JGT

+0

@ KI4JGT: Funziona perfettamente con Python 3.3.2. – dfernan

+0

Funziona se l'elemento dell'elenco è memorizzato come "intero", come deve essere gestito in caso di valori float? Ad esempio, list1 = [1, 1.10, 1.11, 1.1, 1.2] – sathish

28

È possibile passare una funzione al parametro key a the .sort method. Con questo, il sistema ordinerà per chiave (x) invece di x.

list1.sort(key=int) 

BTW, per convertire l'elenco di numeri interi in modo permanente, utilizzare the map function

list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x 

o di lista

list1 = [int(x) for x in list1] 
8

Il tipo di Python non è strano. E 'solo che questo codice:

for item in list1: 
    item=int(item) 

non sta facendo quello che si pensa che è - item non viene sostituito di nuovo nella lista, è semplicemente gettato via.

In ogni caso, la soluzione corretta è utilizzare key=int come altri hanno mostrato.

+0

Ooh questo è un buon punto! Grazie! – Brian

13

Nel caso in cui si desidera utilizzare la funzione sorted(): sorted(list1, key=int)

Si restituisce una nuova lista ordinata.

-1

La soluzione più recente è giusta. Stai leggendo le soluzioni come una stringa, nel qual caso l'ordine è 1, quindi 100, quindi 104 seguito da 2 quindi 21, quindi 2001001010, 3 e così via.

si deve lanciare la vostra input come un int invece:

stringhe ordinate:

stringList = (1, 10, 2, 21, 3)

interi ordinati:

intList = (1, 2, 3, 10, 21)

Per lanciare, appena messo lo stringList dentro int (blahblah).

Anche in questo caso:

stringList = (1, 10, 2, 21, 3) 

newList = int (stringList) 

print newList 

=> returns (1, 2, 3, 10, 21) 
+0

TypeError: l'argomento int() deve essere una stringa o un numero, non una 'tupla' –

+0

Inoltre, le stringhe nella lista stringhe devono avere virgolette. – Teepeemm

+1

Questa è una previsione incredibile: "la soluzione più recente è giusta";) – GreenAsJade

-1
scores = ['91','89','87','86','85'] 
scores.sort() 
print (scores) 

Questo ha funzionato per me con Python versione 3, anche se non ha fatto in versione 2.

+0

Provare a ordinare con '11 e '100' lì, quando le cose diventano interessanti. – Penz

5

È anche possibile usare:


import re 
def sort_human(l): 
    convert = lambda text: float(text) if text.isdigit() else text 
    alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ] 
    l.sort(key=alphanum) 
    return l 
 

questo è molto simile per altre cose che puoi trovare su internet ma funziona anche per caratteri alfanumerici come [abc0.1, abc0.2 ..]

3

risposta s' Seamus Campbell doesnot lavoro su python2.X.
list1 = sorted(list1, key=lambda e: int(e)) utilizzando la funzione lambda funziona correttamente.

Problemi correlati