J'ai une liste de nombres, disons L = [50, 10, 30]
, et en Python je veux retourner une liste donnant l'index d'ordre de chaque élément dans L < / code>, qui serait cette sortie:
[2, 0, 1]
.
Bien que cela semble être une tâche simple, de nombreuses questions sur ce site ( ici ici et ici par exemple) se concentrent sur le dans l'autre sens, c'est-à-dire l'index du point de vue de la liste triée : [1, 2, 0]
, ce qui n'est pas ce que je veux.
Merci,
MODIFIER: à propos des répétitions, je voudrais qu'elles soient également comptées (tirages pris par ordre d'apparition). [50,30,10,30]
donnerait [3,1,0,2 circular
4 Réponses :
c'est la liste d'index de l'ordre trié:
def sort_order(lst): orders = sorted(list(range(len(lst))), key=lambda x: lst[x]) ret = [0] * len(lst) for i in range(len(ret)): ret[orders[i]] = i return ret print(sort_order([50, 10, 30]) # [2,0,1]
Énumération et tri deux fois comme:
(2, 0, 1)
L = [50, 10, 30] x = tuple(k[1] for k in sorted((x[1], j) for j, x in enumerate( sorted((x, i) for i, x in enumerate(L))))) print(x)
Une doublure:
l = [50, 30, 10, 30] numpy.argsort(numpy.argsort(l)) # array([3, 1, 0, 2])
Je savais que np.argsort
fonctionnerait, mais je ne savais pas comment :-)
Utilisation de dictées ..
L = [50, 10, 30, 10, 30] d = {counter:value for counter,value in enumerate(L)} #L is your list sorteddict = sorted(d.items(), key=lambda x: x[1]) d2 = {counter:value for counter,value in enumerate(sorteddict)} order_index = {d2[i][0]:i for i in d2} print(order_index.values())
Merci, mais la sortie de votre solution n'est pas la même que la sortie souhaitée (cela pourrait être la raison du vote négatif) Marc
Bon point. J'ai mal compris la question. Édité avec le bon code.
Qu'espérez-vous qu'il se passe lorsqu'il y a des répétitions d'un nombre dans la liste? Dites que le nombre le plus bas
10
est répété deux fois, vous attendez-vous à ce que la sortie affiche deux[0,0]
suivis d'un2
au lieu de < code> 1 ?@SudheeshSinganamalla j'ai édité..merci pour cette remarque
Cette question n'est-elle pas une copie de ceci ?