68 votes

Comment récupérer des éléments à partir d'un dictionnaire dans l'ordre dans lequel elles sont insérées?

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?

71voto

dF. Points 29787

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.

17voto

Eli Courtwright Points 53071

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')]

5voto

Cody Brocious Points 24042

Vous ne pouvez pas faire cela avec la base dict classe -- il est commandé par hachage. Vous pouvez construire votre propre dictionnaire, c'est vraiment une liste de clé,la valeur des paires ou somesuch, qui serait ordonné.

5voto

Gerry Points 317

Ou, il suffit de faire la clé d'un n-uplet avec le temps.maintenant() est le premier champ dans le tuple.

Ensuite, vous pouvez récupérer les clés à dictname.keys(), de tri, et le tour est joué!

Gerry

3voto

jaywgraves Points 47

J'ai utilisé StableDict avant de avec succès.

http://pypi.python.org/pypi/StableDict/0.2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X