2013-11-25 16 views
15

Gibt es eine Möglichkeit, die sort() - Methode oder eine andere Methode zum Sortieren einer Liste nach Spalten zu verwenden? Lets sagen, dass ich die Liste haben:Wie sortiere ich multidimensionales Array für Spalte?

[ 
[John,2], 
[Jim,9], 
[Jason,1] 
] 

Und ich wollte es sortieren, so dass es würde wie folgt aussehen:

[ 
[Jason,1], 
[John,2], 
[Jim,9], 
] 

Was ist der beste Ansatz wäre, dies zu tun?

Edit:

Im Moment habe ich in einen Index außerhalb des zulässigen Bereichs Fehler leite. Ich habe ein zweidimensionales Array, das sagen wir 1000 Zeilen b 3 Spalten. Ich möchte es anhand der dritten Spalte sortieren. Ist das der richtige Code dafür?

sorted_list = sorted(list_not_sorted, key=lambda x:x[2]) 
+0

siehe: http: // stackoverflow.com/questions/2828059/sorting-arrays-in-numpy-by-spalte – duhaime

+0

Gerade jetzt renne ich in einen Index außerhalb des Bereichs Fehler. Ich habe ein zweidimensionales Array, das sagen wir 1000 Zeilen b 3 Spalten. Ich möchte es anhand der dritten Spalte sortieren. Ist das der richtige Code dafür? sorted_list = sortierte (list_not_sorted, key = lambda x: x [2]) –

+0

Als Antwort auf Ihre Bearbeitung, da Listen null indiziert sind, ist ja x [2] die dritte Spalte. Die Moral der Geschichte ist, dass Sie einen Schlüssel und ein Lambda oder eine tatsächliche Funktion verwenden können, um nach einer bestimmten Bedingung in den Sortier- und Sortierfunktionen zu sortieren. – squiguy

Antwort

22

Ja. Die sorted Einbau-nimmt ein key Argument:

sorted(li,key=lambda x: x[1]) 
Out[31]: [['Jason', 1], ['John', 2], ['Jim', 9]] 

beachten Sie, dass sorted eine neue Liste zurück. Wenn Sie an Ort und Stelle sortieren möchten, verwenden Sie die .sort Methode Ihrer Liste (die auch bequemerweise ein key Argument akzeptiert).

oder alternativ

from operator import itemgetter 
sorted(li,key=itemgetter(1)) 
Out[33]: [['Jason', 1], ['John', 2], ['Jim', 9]] 

Read more on the python wiki.

+0

Ich möchte erwähnen, dass dies eine neue Liste zurückgibt. – iCodez

+1

In der Tat. Wenn Sie die ursprüngliche Liste ändern möchten, wäre das 'li.sort (key = whatevery)'. – user2357112

6

Sie können die sortierte Methode mit einem Schlüssel verwenden.

sorted(a, key=lambda x : x[1]) 
0

Sie können list.sort mit seinen optionalen key parameter verwenden und ein lambda expression:

>>> lst = [ 
...  ['John',2], 
...  ['Jim',9], 
...  ['Jason',1] 
... ] 
>>> lst.sort(key=lambda x:x[1]) 
>>> lst 
[['Jason', 1], ['John', 2], ['Jim', 9]] 
>>> 

Dies wird die Liste an Ort und Stelle sortieren.


Beachten Sie, dass für große Listen, wird es schneller sein operator.itemgetter zu verwenden, anstatt ein lambda:

>>> from operator import itemgetter 
>>> lst = [ 
...  ['John',2], 
...  ['Jim',9], 
...  ['Jason',1] 
... ] 
>>> lst.sort(key=itemgetter(1)) 
>>> lst 
[['Jason', 1], ['John', 2], ['Jim', 9]] 
>>> 
+0

Was genau ist der "Lambda" Schlüssel? –

+0

@ user3024130 - Das 'Lambda' erzeugt eine Inline-Funktion für den Parameter' key'. Ich habe einen Link hinzugefügt, um besser zu erklären. Die Verwendung eines 'lambda' wäre nicht anders als' def func (x): return x [1] 'und dann' lst.sort (key = func) '. – iCodez

+0

Okay, das macht Sinn. Wie würdest du es vom höchsten zum niedrigsten statt vom niedrigsten zum höchsten sortieren? –

0

Die optionalen key Parameter sort/sorted sind eine Funktion. Die Funktion wird für jedes Element genannt und die Rückgabewerte die Reihenfolge der die print aus der Funktion verlässt

>>> def my_key_func(item): 
...  return item[1] 

einfach genug Diese Funktion ist unter

>>> lst = [['John', 2], ['Jim', 9], ['Jason', 1]] 
>>> def my_key_func(item): 
...  print("The key for {} is {}".format(item, item[1])) 
...  return item[1] 
... 
>>> sorted(lst, key=my_key_func) 
The key for ['John', 2] is 2 
The key for ['Jim', 9] is 9 
The key for ['Jason', 1] is 1 
[['Jason', 1], ['John', 2], ['Jim', 9]] 

Art bestimmen zu schreiben „inline“ als eine Lambda-Funktion

>>> sorted(lst, key=lambda item: item[1]) 
[['Jason', 1], ['John', 2], ['Jim', 9]] 
0
sorted(list, key=lambda x: x[1]) 

Hinweis: dies funktioniert auf Zeitvariable auch.

Verwandte Themen