J'ai un dictionnaire qui ressemble à ceci:

d1= {'a':[1, 5], 'b':[2, 23], 'c':[99,12]}

Avant que le dictionnaire n'ait une liste de deux valeurs, je pourrais simplement trier comme ceci:

for key in sorted(mydict, key=mydict.get, reverse=True):
    print key.rstrip() + " : " + str(mydict[key])

Cela fonctionne toujours pour la première valeur de la liste, mais cela ne fait rien pour la deuxième valeur:

c : [99, 12]
b : [2, 23]
a : [1, 5]

Comment puis-je trier par la deuxième valeur de la liste à la place? Comment puis-je trier par la deuxième valeur PUIS la première valeur, ou vice versa si je le souhaite?

0
Thisisstackoverflow 16 janv. 2017 à 22:46

2 réponses

Meilleure réponse

En fait, il fait quelque chose avec la deuxième valeur: celle-ci est utilisée comme tie-breaker dans le cas où les premières valeurs sont égales.

Néanmoins, vous pouvez simplement utiliser une expression lambda comme key:

for key in sorted(mydict, key=lambda x: (mydict.get(x)[1],mydict.get(x)[0]), reverse=True):
    print key.rstrip() + " : " + str(mydict[key])

Ce qui se passe ici, c'est que vous prenez comme "clé" comment trier les valeurs, vous obtenez la valeur en appelant mydict.get(x), maintenant vous pouvez construire un nouveau tuple (mydict.get(x)[1],mydict.get(x)[0]) où le deuxième élément est placé en premier et le premier élément comme second.

Puisque les tuples sont triés par ordre lexicographique , cela signifie que Python comparera d'abord sur le premier élément et en cas d'égalité le deuxième élément. Maintenant que nous avons échangé les places, il va donc d'abord comparer sur la seconde puis sur la première.

Vous pouvez cependant, comme le dit @ Jean-FrançoisFabre, utiliser [::-1] pour inverser le tuple en enregistrant une opération .get (et le résultat semble plus élégant) ainsi:

for key in sorted(mydict, key=lambda x: mydict.get(x)[::-1], reverse=True):
    print key.rstrip() + " : " + str(mydict[key])

Notez cependant qu'une manière plus élégante de résoudre ce problème serait de trier immédiatement les tuples clé-valeur:

for key,value in sorted(mydict.items(), key=lambda x:x[1][::-1], reverse=True):
    print key.rstrip() + " : " + str(value)
3
Willem Van Onsem 16 janv. 2017 à 19:55

Cette question est donc ancienne, mais cela pourrait aider quelqu'un. Avertissement: je ne connais pas python, je vais donc décrire cela en termes très larges et cela pourrait être possible ou non. J'ai fait cela en C #.

Si vous avez besoin que vos articles soient triés une fois, utilisez la bonne réponse de Willern. Si vous avez besoin qu'ils soient triés en permanence, continuez à lire.

J'ai trouvé qu'il était plus opportun de créer un nouvel objet de collection qui mélangeait un dictionnaire et une liste. Le nouvel objet de collection a exporté toutes les méthodes qu'une liste aurait, et a géré les ajouts, etc. en ajoutant des éléments aux deux collections. Le constructeur a pris un lambda pour obtenir la clé d'une valeur afin que le dictionnaire puisse être rempli. La collection a également exporté toutes les méthodes qu'un dictionnaire aurait pour la lecture (mais pas pour l'écriture pour la raison évidente) afin que la recherche de clé soit rapide. De plus, il y avait une méthode AddRange pour que l'insertion ne soit pas O (N ^ 2). AddRange ajoute simplement tous les éléments à la liste et appelle le tri.

L'extension de la façon de trier par quelque chose devrait être assez évidente.

0
Joshua 5 sept. 2018 à 20:01