2010-09-16 17 views
5

Was ist der beste Weg, um eine Liste von Floats nach ihrem Wert zu sortieren, während immer noch die ursprüngliche Reihenfolge aufgezeichnet wird.Sortierung unter Beibehaltung der Reihenfolge in Python

I.e. Sortieren von a:

a=[2.3, 1.23, 3.4, 0.4] 

kehrt so etwas wie

a_sorted = [0.4, 1.23, 2.3, 3.4] 
a_order = [4, 2, 1, 3] 

Wenn Sie was ich meine.

Antwort

14

Man könnte so etwas tun:

>>> sorted(enumerate(a), key=lambda x: x[1]) 
[(3, 0.4), (1, 1.23), (0, 2.3), (2, 3.4)] 

Wenn Sie die Indizierung müssen mit 1 statt 0 zu starten, enumerate den zweiten Parameter akzeptiert.

+0

+1 für die Verwendung von Aufzählung! – GWW

+0

'aorder, asorted = zip (* sortiert (enumerate (a), key = lambda x: x [1])' aus Gründen der Vollständigkeit. – carl

+0

Ich würde mir ziemlich sicher sein, dass OP seine beiden Listen auf einmal zurücksenden müsste – SilentGhost

5
  • Verwenden Sie enumerate, um die Sequenznummern zu generieren.
  • Verwenden sorted mit einem key von den Schwimmern
  • Verwenden zip zu trennen, um die Reihenfolge von den Werten zu sortieren

Zum Beispiel:

a_order, a_sorted = zip(*sorted(enumerate(a), key=lambda item: item[1])) 
3

Wenn Sie numpy installiert haben:

import numpy 
a=[2.3, 1.23, 3.4, 0.4] 
a_sorted = numpy.sorted(a) 
a_order = numpy.argsort(a) 
+0

Das ist nett für einen Mann, der mehr Matlab als Python verwendet =) – Theodor

0
from itertools import izip 
a_order, a_sorted = [list(b) for b in izip(*sorted(enumerate(a, 1), key=lambda n: n[1]))] 
Verwandte Themen