Сортировка при сохранении порядка в питоне - PullRequest
5 голосов
/ 16 сентября 2010

Как лучше всего отсортировать список чисел с плавающей точкой по их значению, сохраняя при этом запись начального порядка.

т.е. сортировка:

a=[2.3, 1.23, 3.4, 0.4]

возвращает что-то вроде

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

Если вы поймаете мой дрейф.

Ответы [ 4 ]

15 голосов
/ 16 сентября 2010

Вы можете сделать что-то вроде этого:

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

Если вам нужно начать индексирование с 1 вместо 0, enumerate принимает второй параметр.

5 голосов
/ 16 сентября 2010
  • Используйте enumerate для генерации порядковых номеров.
  • Используйте sorted с key для сортировки по числам
  • Используйте zip, чтобы отделить порядок от значений

Например:

a_order, a_sorted = zip(*sorted(enumerate(a), key=lambda item: item[1]))
3 голосов
/ 16 сентября 2010

Если у вас установлено numpy:

import numpy
a=[2.3, 1.23, 3.4, 0.4]
a_sorted = numpy.sorted(a)
a_order = numpy.argsort(a)
0 голосов
/ 16 сентября 2010
from itertools import izip
a_order, a_sorted = [list(b) for b in izip(*sorted(enumerate(a, 1), key=lambda n: n[1]))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...