2013-09-01 28 views
6

Ho seguente tipo di listaOrdinamento 2D lista python

[1, 0.23] 
[2, 0.39] 
[4, 0.31] 
[5, 0.27] 

voglio ordinare questo al fine della seconda colonna discendente. Ho provato la funzione 'ordinata' in python. Ma mi dà un 'TypeError': l'oggetto 'float' è unsubscriptable. Per favore aiutami a risolvere questo problema.

+1

Mi dispiace, ma non è un elenco. Questa è una sequenza di numeri con newline, ma non una qualsiasi struttura Python. Si prega di inviare il codice effettivo che non è riuscito per voi e la rappresentazione della lista. –

+1

Ora abbiamo una sequenza di liste python; c'è una lista esterna? –

+0

Evidentemente non off-topic, poiché è il risultato della ricerca Google numero 1 per l'ordinamento di un elenco 2D in Python e la risposta migliore ha 15 voti positivi. – JeffThompson

risposta

11

per ordinare un elenco di liste sulla seconda colonna, utilizzare operator.itemgetter() per facilità e chiarezza:

from operator import itemgetter 
outputlist = sorted(inputlist, key=itemgetter(1), reverse=True) 

o, per ordinare sul posto:

from operator import itemgetter 
inputlist.sort(key=itemgetter(1), reverse=True) 

itemgetter() è un po 'più veloce utilizzando un lambda per l'attività.

Demo:

>>> from operator import itemgetter 
>>> inputlist = [ 
...  [1, 0.23], 
...  [2, 0.39], 
...  [4, 0.31], 
...  [5, 0.27], 
... ] 
>>> sorted(inputlist, key=itemgetter(1), reverse=True) 
[[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]] 

Faresti vedere solo il tuo eccezione se si fosse in virgola mobile valori nel vostro inputlist direttamente:

>>> inputlist.append(4.2) 
>>> inputlist 
[[1, 0.23], [2, 0.39], [4, 0.31], [5, 0.27], 4.2] 
>>> sorted(inputlist, key=itemgetter(1), reverse=True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'float' object is not subscriptable 

(per Python 3; messaggio di errore Python 2 di è leggermente diverso, con conseguente TypeError: 'float' object has no attribute '__getitem__' invece).

Questo perché la chiamata itergetter(1) viene applicata a tutti gli elementi nell'elenco esterno ma funziona solo su sequenze ordinate nidificate, non sul valore a virgola mobile ora aggiunto.

+0

Ho provato questo, ma poiché la mia seconda colonna è float mi dà 'TypeError': l'oggetto 'float' è unsubscriptable –

+1

@ChinthakaNadunRatnaweera: No, allora la tua lista non è nidificata. Hai valori float * direttamente * referenziati nella tua lista esterna. Stampa la tua lista e copialo alla tua domanda. –

18

È possibile utilizzare un lambda:

>>> li=[[1, 0.23], 
... [2, 0.39], 
... [4, 0.31], 
... [5, 0.27]] 
>>> sorted(li,key=lambda l:l[1], reverse=True) 
[[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]] 

O il contrario:

>>> sorted(li,key=lambda l:l[1]) 
[[1, 0.23], [5, 0.27], [4, 0.31], [2, 0.39]]