python: itération sur le dictionnaire triés par clé
J'ai un Python dictionnaire
steps = {1:"value1", 5:"value2", 2:"value3"}
J'ai besoin pour effectuer une itération sur ce qui est de l'ordre de tri par la clé.
J'ai essayé ceci:
x = sorted(steps, key=lambda key: steps[key])
mais les valeurs sont passés de x.
Vous devez vous connecter pour publier un commentaire.
Je pense que
lambdas
est exagéré ici, essayez ceci:sorted(steps)
est mieux quesorted(steps.keys())
sorted(steps)
mieux quesorted(steps)
? Est-il une différence de performance?for key,value in sorted(steps): print value
est nettement plus rapide quefor key in sorted(steps): print steps[key]
for key,value in sorted(steps): print value
donneTypeError: 'int' object is not iterable
- vous signifiaitfor key,value in sorted(steps.iteritems()): print value
?for key, value in sorted(steps.items()):
.Vous avez besoin pour effectuer une itération sur
steps.items()
, car une itération sur dict ne renvoie ses clés.Itérer sur triés clés:
key
poursorted
à tous, dictionnaire clés sont liés à être unique afinsorted(steps.items())
fonctionne très bienkey
n'est pas nécessaire dans ce cas.Vous pouvez également utiliser l'un de Python de nombreux SortedDict types de conteneurs. Ces types de maintenir automatiquement le dictionnaire triés clés dans l'ordre. Jetez un oeil à la sortedcontainers module qui est pur Python et rapide-que-C-implémentations. Il y a un comparaison des performances que les points de référence de plusieurs autres implémentations les uns contre les autres.
Dans votre cas, alors, vous pouvez utiliser:
Itération pour les clés/valeurs/articles fonctionne automatiquement triés par ordre des clés.
Comme indiqué par Zagorulkin Dmitry, vous ne devez pas passer un lambda de la fonction de tri. La fonction de tri comportement par défaut est d'agir sur les touches.
Cependant, le passage de la lambda à la fonction de tri n'est pas un meilleur fonctionnement de peu d'intérêt (c'est à dire un "overkill"), mais il est en fait indésirable. Elle rend le code moins lisible et il est aussi plus lent, surtout si vous allez l'appliquer à de très grands dictionnaires ou de faire appel à de multiples reprises. D'autres que de faire le tri cible plus explicite à l'égard de l' (clé, valeur) paires, il n'y a aucun avantage à utiliser. Le minutage suivant montrent les performances que vous obtenez lors de la spécification d'un lambda.
Dans le cas où vos clés ne sont pas des entiers, mais des chaînes de caractères qui doit être analysé comme les entiers:
vous pouvez utiliser quelque chose de similaire à votre solution:
Selon votre cas d'utilisation, il peut être une option à tenir un déjà commandé dictionnaire. Voir les pythons OrderedDict pour plus de détails. Si vous souhaitez trier les touches entier, vous devez les convertir en nombres entiers. Le meilleur moment pour le faire dépend de votre cas d'utilisation.