5
votes

comment renvoyer l'index d'ordre de chaque élément d'une liste?

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


3 commentaires

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'un 2 au lieu de < code> 1 ?


@SudheeshSinganamalla j'ai édité..merci pour cette remarque


Cette question n'est-elle pas une copie de ceci ?


4 Réponses :


3
votes

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]


0 commentaires

1
votes

Énumération et tri deux fois comme:

(2, 0, 1)

Résultats:

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)


0 commentaires

6
votes

Une doublure:

l = [50, 30, 10, 30]
numpy.argsort(numpy.argsort(l))
# array([3, 1, 0, 2])


1 commentaires

Je savais que np.argsort fonctionnerait, mais je ne savais pas comment :-)



-1
votes

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())

entrez la description de l'image ici


2 commentaires

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.