2010-09-16 13 views
5

Jaki jest najlepszy sposób sortowania listy wartości liczbowych według ich wartości, przy jednoczesnym zachowaniu rekordu początkowego zamówienia.Sortowanie z zachowaniem porządku w pythonie

tj. sortowania a:

a=[2.3, 1.23, 3.4, 0.4] 

powraca coś

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

Jeśli złapiesz o co mi chodzi.

Odpowiedz

14

Można zrobić coś takiego:

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

Jeśli trzeba indeksowania zacząć 1 zamiast 0, enumerate akceptuje drugi parametr.

+0

+1 za używanie wyliczenia! – GWW

+0

'aorder, asorted = zip (* posortowane (wyliczenie (a), klucz = lambda x: x [1])' dla kompletności – carl

+0

Byłbym całkiem pewny, OP musiałby spakować swoje dwie listy z powrotem na jednym etapie – SilentGhost

5
  • Użyj enumerate, aby wygenerować numery sekwencji.
  • Zastosowanie sorted z key do sortowania przez pływaków
  • użytkowania zip wydzielić kolejności od wartości

Na przykład:

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

Jeśli masz numpy zainstalowany:

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

To jest miłe dla faceta bardziej przyzwyczajonego do matlab niż python =) – 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]))] 
Powiązane problemy