Essentiellement, vous devez faire une argsort
, quelle implémentation dont vous avez besoin dépend si vous voulez utiliser des bibliothèques externes (par exemple NumPy) ou si vous voulez rester pure-Python sans dépendances.
La question que vous devez vous poser est la suivante: voulez-vous
- indices qui trieraient le tableau / la liste
- indices que les éléments auraient dans le tableau / liste trié
Malheureusement, l'exemple de la question ne précise pas ce qui est souhaité car les deux donneront le même résultat:
>>> 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)
Choisir le argsort
implémentation
Si vous avez NumPy à votre disposition, vous pouvez simplement utiliser la fonction numpy.argsort
ou la méthode numpy.ndarray.argsort
.
Une implémentation sans NumPy a déjà été mentionnée dans certaines autres réponses, je vais donc récapituler la solution la plus rapide en fonction de la réponse de référence ici
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Obtenir les indices qui trieraient le tableau / la liste
Pour obtenir les indices qui trieraient le tableau / la liste, vous pouvez simplement appeler argsort
le tableau ou la liste. J'utilise les versions de NumPy ici mais l'implémentation Python devrait donner les mêmes résultats
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
Le résultat contient les indices nécessaires pour obtenir le tableau trié.
Puisque le tableau trié serait [1, 2, 3, 4]
le tableau argsorted contient les indices de ces éléments dans l'original.
- La plus petite valeur est
1
et elle est à l'index 1
dans l'original, donc le premier élément du résultat est1
.
- Le
2
est à l'index 2
dans l'original donc le deuxième élément du résultat est 2
.
- Le
3
est à l'index 0
dans l'original, donc le troisième élément du résultat est 0
.
- La plus grande valeur
4
et elle est à l'index 3
dans l'original, donc le dernier élément du résultat est 3
.
Obtention des indices que les éléments auraient dans le tableau / liste trié
Dans ce cas, vous devrez postuler argsort
deux fois :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
Dans ce cas :
- le premier élément de l'original est
3
, qui est la troisième plus grande valeur de sorte qu'il aurait un index 2
dans le tableau / liste trié de sorte que le premier élément est2
.
- le deuxième élément de l'original est
1
, qui est la plus petite valeur pour qu'il ait un index 0
dans le tableau / liste trié, de sorte que le deuxième élément l'est 0
.
- le troisième élément de l'original est
2
, qui est la deuxième plus petite valeur, de sorte qu'il aurait un index 1
dans le tableau / liste trié, de sorte que le troisième élément l'est 1
.
- le quatrième élément de l'original est
4
la valeur la plus élevée, il aurait donc un index 3
dans le tableau / la liste trié, de sorte que le dernier élément l'est 3
.