Est-il possible de récupérer des éléments à partir d'un dictionnaire Python dans l'ordre dans lequel ils ont été insérés?
Réponses
Trop de publicités?Le standard de python dict
n'est pas capable de faire cela.
Il s'agit d'une proposition (PEP 372), d'ajouter un "ordonné dictionnaire" (qui garde une trace de l'ordre d'insertion) à l' collections
module de la bibliothèque standard. Il comprend des liens vers les différentes implémentations de commandé les dictionnaires (voir aussi ces deux recettes dans le Python Cookbook).
Vous pourriez voulez coller avec la référence de la mise en œuvre du PEP si vous voulez que votre code soit compatible avec la version "officielle" (si la proposition est finalement acceptée).
EDIT: Le PEP a été accepté et ajouté dans python 2.7 et 3.1. Voir les docs.
Les autres réponses sont correctes; il n'est pas possible, mais vous pouvez écrire vous-même. Toutefois, dans le cas où vous n'êtes pas sûr de la façon de mettre en œuvre quelque chose de ce genre, voici une complète et travailler de mise en œuvre que les sous-classes dict que j'ai juste écrit et testé. (Notez que l'ordre des valeurs transmises par le constructeur n'est pas défini, mais viendra avant des valeurs transmises plus tard, et vous pouvez toujours juste de ne pas permettre commandé dicts être initialisé avec les valeurs.)
class ordered_dict(dict):
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
self._order = self.keys()
def __setitem__(self, key, value):
dict.__setitem__(self, key, value)
if key in self._order:
self._order.remove(key)
self._order.append(key)
def __delitem__(self, key):
dict.__delitem__(self, key)
self._order.remove(key)
def order(self):
return self._order[:]
def ordered_items(self):
return [(key,self[key]) for key in self._order]
od = ordered_dict()
od["hello"] = "world"
od["goodbye"] = "cruel world"
print od.order() # prints ['hello', 'goodbye']
del od["hello"]
od["monty"] = "python"
print od.order() # prints ['goodbye', 'monty']
od["hello"] = "kitty"
print od.order() # prints ['goodbye', 'monty', 'hello']
print od.ordered_items()
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]