По сути, вам нужно сделать argsort
, какая реализация вам нужна, зависит от того, хотите ли вы использовать внешние библиотеки (например, NumPy) или хотите оставаться чистым Python без зависимостей.
Вам нужно задать себе следующий вопрос: хотите ли вы
- индексы, которые будут сортировать массив / список
- индексы, которые элементы будут иметь в отсортированном массиве / списке
К сожалению, пример в вопросе не проясняет, что желательно, потому что оба дадут одинаковый результат:
>>> arr = np.array([1, 2, 3, 100, 5])
>>> np.argsort(np.argsort(arr))
array([0, 1, 2, 4, 3], dtype=int64)
>>> np.argsort(arr)
array([0, 1, 2, 4, 3], dtype=int64)
Выбор реализации argsort
Если у вас есть NumPy, вы можете просто использовать функцию numpy.argsort
или метод _5 _.
Реализация без NumPy уже упоминалась в некоторых других ответах, поэтому я просто резюмирую самое быстрое решение в соответствии с эталонным ответом здесь
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Получение индексов для сортировки массива / списка
Чтобы получить индексы, которые будут сортировать массив / список, вы можете просто вызвать argsort
в массиве или списке. Здесь я использую версии NumPy, но реализация Python должна давать те же результаты.
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
Результат содержит индексы, необходимые для получения отсортированного массива.
Поскольку отсортированный массив будет [1, 2, 3, 4]
, отсортированный массив содержит индексы этих элементов в оригинале.
- Наименьшее значение -
1
, а в оригинале он находится под индексом 1
, поэтому первым элементом результата является 1
.
2
находится в индексе 2
в оригинале, поэтому второй элемент результата - 2
.
3
находится в индексе 0
в оригинале, поэтому третий элемент результата - 0
.
- Наибольшее значение
4
и индекс 3
в оригинале, поэтому последний элемент результата - 3
.
Получение индексов, которые элементы будут иметь в отсортированном массиве / списке
В этом случае вам нужно будет применить argsort
дважды:
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
В таком случае :
- первым элементом оригинала является
3
, что является третьим по величине значением, поэтому он будет иметь индекс 2
в отсортированном массиве / списке, поэтому первым элементом является 2
.
- вторым элементом оригинала является
1
, что является наименьшим значением, поэтому он будет иметь индекс 0
в отсортированном массиве / списке, поэтому вторым элементом является 0
.
- третий элемент оригинала - это
2
, что является вторым наименьшим значением, поэтому он будет иметь индекс 1
в отсортированном массиве / списке, поэтому третий элемент - это 1
.
- четвертым элементом оригинала является
4
, что является наибольшим значением, поэтому он будет иметь индекс 3
в отсортированном массиве / списке, поэтому последний элемент - 3
.
person
MSeifert
schedule
17.08.2019