Impossible de trier un dictionnaire par definition (sauf depuis Python 3.7 qui garanti l’ordre par insertion).
Tu peux utiliser OrderedDict
qui vient avec collections
.
Et comme j’aime les one-liner degueulasse:
from collections import OrderedDict
players = {
12: {
'score1': 3,
'score2': 8,
'score3': 4,
},
20: {
'score1': 4,
'score2': 9,
'score3': 1,
},
14: {
'score1': 4,
'score2': 9,
'score3': 2,
}
}
OrderedDict(sorted(iteritems(players), key=lambda x: sorted(iteritems(x[1]), key=lambda y: y[0])))
Decortiquons ce qu’il se passe:
- iteritems va renvoyer une liste (donc triable) fait de pair (cle, valeur)
- sorted permet de trier la liste
- l’argument key de la methode
sorted
indique avec quelle cle on veut trier. Je te rappelle que chaque element de la liste a trier est (cle, valeur). Exemple: (12, { 'score1': 3, 'score2': 8, 'score3': 4, })
.
- On accede donc au dictionnaire qui contient les differents scores qu’il nous faut egalement trier (je suppose que tes cles doivent etre triees par ordre lexicographique). Autrement dit, sur l’exemple precendent
iteritems(x[1])
va retourner [('score1', 3), ('score2', 8), ( 'score3', 4)]
, puis on va trier par les clefs.
- La fonction sorted precedente recupere donc
[3,8,4]
.
- Comme la comparaison sur entre deux listes d’entiers s’opere entier par entier, cela permet d’obtenir le resultat voulu.
>>> OrderedDict(sorted(iteritems(players), key=lambda x: sorted(iteritems(x[1]), key=lambda y: y[0])))
OrderedDict([(12, {'score1': 3, 'score2': 8, 'score3': 4}), (20, {'score1': 4, 'score2': 9, 'score3': 1}), (14, {'score1': 4, 'score2': 9, 'score3': 2})])