268 votes

Comment obtenir les indices d'un tableau trié en Python ?

J'ai une liste numérique :

myList = [1, 2, 3, 100, 5]

Maintenant, si je trie cette liste pour obtenir [1, 2, 3, 5, 100] . Ce que je veux, ce sont les indices des éléments de la base de données liste originale dans l'ordre trié, c'est-à-dire [0, 1, 2, 4, 3] --- à l'instar de la fonction de tri de MATLAB qui renvoie à la fois valeurs et des indices.

2 votes

0 votes

@unutbu Ce n'est pas un dupe (IMO). La question ne contredit pas l'utilisation de Numpy.argsort().

0 votes

@amit : Que voulez-vous dire par "ne contredit pas" ?

258voto

Matthew Lewis Points 314

Si vous utilisez numpy, vous disposez de la fonction argsort() :

>>> import numpy
>>> numpy.argsort(myList)
array([0, 1, 2, 4, 3])

http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html

Cela renvoie les arguments qui permettraient de trier le tableau ou la liste.

3 votes

Notez que ce n'est peut-être pas ce que vous voulez ! Voir cette question : stackoverflow.com/questions/54388972/

191voto

Roman Bodnarchuk Points 12136

Quelque chose comme la suivante :

>>> myList = [1, 2, 3, 100, 5]
>>> [i[0] for i in sorted(enumerate(myList), key=lambda x:x[1])]
[0, 1, 2, 4, 3]

enumerate(myList) vous donne une liste contenant des tuples de (index, valeur) :

[(0, 1), (1, 2), (2, 3), (3, 100), (4, 5)]

Vous triez la liste en la passant à sorted et en spécifiant une fonction permettant d'extraire la clé de tri (le deuxième élément de chaque tuple ; c'est ce que fait la fonction lambda est pour. Enfin, l'indice original de chaque trié est extrait à l'aide de l'élément [i[0] for i in ...] la compréhension de la liste.

7 votes

Vous pouvez utiliser itemgetter(1) au lieu de la fonction lambda

4 votes

@gnibbler fait référence à la itemgetter dans le operator module, FYI. Alors faites from operator import itemgetter pour l'utiliser.

2 votes

Vous pouvez obtenir la liste triée et les indices en utilisant zip : sorted_items, sorted_inds = zip(*sorted([(i,e) for i,e in enumerate(my_list)], key=itemgetter(1)))

88voto

robert king Points 5369
myList = [1, 2, 3, 100, 5]    
sorted(range(len(myList)),key=myList.__getitem__)

[0, 1, 2, 4, 3]

5 votes

25voto

Ant6n Points 128

Les réponses avec enumerate sont sympathiques, mais personnellement je n'aime pas le lambda utilisé pour trier par la valeur. Ce qui suit ne fait qu'inverser l'indice et la valeur, et les trie. Ainsi, le tri se fait d'abord par valeur, puis par index.

sorted((e,i) for i,e in enumerate(myList))

14voto

Matt Points 6347

Réponse actualisée avec enumerate y itemgetter :

sorted(enumerate(a), key=lambda x: x[1])
# [(0, 1), (1, 2), (2, 3), (4, 5), (3, 100)]

Fermez les listes ensemble : Le premier élément du tuple sera l'index, le deuxième est la valeur (puis trier en utilisant la deuxième valeur du tuple x[1] , x est le tuple)

Ou en utilisant itemgetter de la operator module` :

from operator import itemgetter
sorted(enumerate(a), key=itemgetter(1))

1 votes

Enumerate semble plus approprié que zip dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X