По суті, вам потрібно зробити 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.