По суті, вам потрібно зробити 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
або методом numpy.ndarray.argsort
.
Про реалізацію без 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
.