2013-09-01 9 views
6

Mam następujący typ listySortowanie 2D lista pyton

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

chcę sortować to w kolejności malejącej drugiej kolumnie. Próbowałem funkcji "posortowane" w python. Ale daje mi "TypeError": obiekt "pływający" jest nieopisywalny. Proszę, pomóż mi rozwiązać ten problem.

+1

Przykro mi, ale to nie jest lista. Jest to ciąg liczb z znakami nowej linii, ale nie ma żadnej struktury Pythona. Proszę zaksięgować rzeczywisty kod, który się nie powiódł, oraz reprezentację listy. –

+1

Teraz mamy sekwencję list Pythona; czy istnieje zewnętrzna lista? –

+0

Oczywiście nie jest to temat wyłączony, ponieważ jest to pierwszy wynik wyszukiwania Google w celu posortowania listy 2D w języku Python, a najlepsza odpowiedź ma 15 głosów up. – JeffThompson

Odpowiedz

11

Aby posortować listę list na drugiej kolumnie, należy operator.itemgetter() dla łatwości i jasności:

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

lub sortowania w miejscu:

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

itemgetter() jest trochę szybsze niż przy użyciu zadania lambda.

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]] 

Można by tylko zobaczyć swój wyjątek gdybyś zmiennoprzecinkowych wartości w inputlist bezpośrednio:

>>> 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 

(dla Pythona 3; komunikat błędu Python 2 jest nieco inny, co powoduje, że zamiast tego jest TypeError: 'float' object has no attribute '__getitem__').

Jest to spowodowane tym, że wywołanie itergetter(1) jest stosowane do wszystkich elementów na liście zewnętrznej, ale działa tylko na sekwencjach zagnieżdżonych, a nie na jednej wartości zmiennoprzecinkowej, która została dodana.

+0

Próbowałem tego, ale ponieważ moja druga kolumna jest zmiennoprzecinkową, daje mi "TypeError": obiekt "pływający" jest niepodpisywalny –

+1

@ChinthakaNadunRatnaweera: Nie, wtedy twoja lista nie jest zagnieżdżona. Masz wartości zmiennoprzecinkowe * bezpośrednio * wymienione na twojej zewnętrznej liście. Wydrukuj listę i skopiuj ją na swoje pytanie. –

18

Można użyć 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]] 

Lub inny sposób:

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