Il existe une fonction existante qui se termine par ce qui suit, où se d
trouve un dictionnaire:
return d.iteritems()
qui renvoie un itérateur non trié pour un dictionnaire donné. Je voudrais retourner un itérateur qui passe par les éléments triés par clé . Comment je fais ça?
python
sorting
dictionary
Mike
la source
la source
.items()
place deiteritems()
: comme l'a dit @Claudiu, iteritems ne fonctionne pas pour Python 3.x, maisitems()
est disponible à partir de Python 2.6.items()
crée une liste et utilise donc de la mémoire, alorsiteritems()
qu'essentiellement n'utilise pas de mémoire. Les éléments à utiliser dépendent principalement de la taille du dictionnaire. De plus, l'outil de conversion automatique Python 2 vers Python 3 (2to3
) prend automatiquement en charge la conversion deiteritems()
versitems()
, il n'y a donc pas lieu de s'inquiéter à ce sujet.collections.OrderedDict
puis vous triez une fois et obtenez toujours les articles dans l'ordre trié.iteritems()
n'utilise pas de mémoire, tout doit être mis en mémoire poursorted()
, donc il n'y a pas de différence entre l'utilisation deitems()
etiteritems()
ici en termes de mémoire.items()
(dans la liste retournée paritems()
, et dans la liste triée) et une seule fois aveciteritems()
(dans la liste triée uniquement).Utilisez la
sorted()
fonction:Si vous voulez un véritable itérateur sur les résultats triés, puisque
sorted()
renvoie une liste, utilisez:la source
Les clés d'un dict sont stockées dans une table de hachage de sorte que soit leur «ordre naturel», c'est-à-dire pseudo-aléatoire. Toute autre commande est un concept du consommateur du dict.
sorted () renvoie toujours une liste, pas un dict. Si vous lui passez un dict.items () (qui produit une liste de tuples), il retournera une liste de tuples [(k1, v1), (k2, v2), ...] qui peuvent être utilisés dans une boucle d'une manière très semblable à un dict, mais ce n'est en aucun cas un dict !
Ce qui suit ressemble à un dict dans une boucle, mais ce n'est pas le cas, c'est une liste de tuples décompressés dans k, v:
À peu près équivalent à:
la source
sorted(foo.keys())
est mieux que l'équivalentsorted(foo)
, car les dictionnaires renvoient leurs clés lorsqu'ils sont itérés (avec l'avantage de ne pas être forcés de créer lafoo.keys()
liste intermédiaire, peut-être - selon la façon dontsorted()
est implémenté les itérables).k in sorted(foo.keys()):
qui tire les touches oufor k,v in sorted(foo.items()):
qui renvoie une copie des paires de listes du dictionnaire, je supposesorted(foo.keys())
La réponse de Greg est juste. Notez qu'en Python 3.0, vous devrez faire
comme
iteritems
sera disparu.la source
Vous pouvez désormais également utiliser
OrderedDict
Python 2.7:Vous avez ici la page Quoi de neuf pour la version 2.7 et l' API OrderedDict .
la source
En général, on peut trier un dict comme ceci:
Pour le cas spécifique de la question, ayant un "drop in replacement" pour d.iteritems (), ajoutez une fonction comme:
et donc la ligne de fin change de
à
ou
la source
Cette méthode a toujours un tri O (N log N), cependant, après une courte segmentation linéaire, elle produit les éléments dans l'ordre trié au fur et à mesure, ce qui la rend théoriquement plus efficace lorsque vous n'avez pas toujours besoin de toute la liste.
la source
Si vous souhaitez trier par ordre d'insertion des éléments au lieu de l'ordre des clés, vous devriez jeter un œil aux collections de Python . (Python 3 uniquement)
la source
trié renvoie une liste, d'où votre erreur lorsque vous essayez de le parcourir, mais comme vous ne pouvez pas commander un dict, vous devrez traiter une liste.
Je n'ai aucune idée du contexte plus large de votre code, mais vous pouvez essayer d'ajouter un itérateur à la liste résultante. comme ça peut-être?:
bien sûr, vous récupérerez les tuples maintenant car triés a transformé votre dict en une liste de tuples
ex: dire que votre dict était:
{'a':1,'c':3,'b':2}
trié le transforme en une liste:Ainsi, lorsque vous parcourez la liste, vous obtenez (dans cet exemple) un tuple composé d'une chaîne et d'un entier, mais au moins vous pourrez le parcourir.
la source
En supposant que vous utilisez CPython 2.x et que vous disposez d'un grand dictionnaire mydict, l'utilisation de tri (mydict) va être lente car triée crée une liste triée des clés de mydict.
Dans ce cas, vous voudrez peut-être regarder mon paquet ordonné qui comprend une implémentation C de
sorteddict
en C. Surtout si vous devez parcourir la liste triée de clés plusieurs fois à différentes étapes (c'est-à-dire le nombre d'éléments) de la durée de vie des dictionnaires.http://anthon.home.xs4all.nl/Python/ordereddict/
la source