2009-04-05 5 views
6

J'ai vu (et écrit) un certain nombre d'implémentations de cela. Y en a-t-il un qui est considéré comme le meilleur ou qui émerge comme norme? Ce que je veux dire par dict ordonnée est que l'objet a un concept de l'ordre des clés, similaire à un tableau en PHP.Quelle est l'implémentation dict la mieux ordonnée en python?

odict de PEP 372 semble être un candidat fort, mais il n'est pas totalement clair que c'est le gagnant.

+2

-1: "Meilleur" est indéfini. –

Répondre

8

Je n'ai pas vu de norme; tout le monde semble rouler le sien (voir les réponses à this question). Si vous pouvez utiliser le OrderedDictpatch de PEP 372, c'est votre meilleur pari. Tout ce qui est inclus dans le stdlib a de très fortes chances d'être ce que tout le monde utilise un an ou deux à partir de maintenant.

12

Celui-ci par Raymond Hettinger est une goutte en remplacement du collections.OrderedDict qui apparaîtra dans Python 2.7: http://pypi.python.org/pypi/ordereddict

La version dev des collections docs disent qu'il est équivalent à ce qui sera en Python 2.7, il est donc probable qu'il s'agira d'une transition en douceur vers celle qui viendra avec Python.

Je l'ai mis en PyPI, de sorte que vous pouvez l'installer avec easy_install ordereddict, et de l'utiliser comme ceci:

from ordereddict import OrderedDict 
d = OrderedDict([("one", 1), ("two", 2)]) 
+0

l'arrêté par Raymond Hettinger semble plus court et plus élégant que collections.OrderedDict. Je pensais à quoi dans les collections. OrdenDict est meilleur que celui de Raymond. Comment se fait-il que celui de l'emballage standard ne soit pas aussi bon que l'autre? – FrostNovaZzz

+0

@FrostNovaZzz collections.OrderedDict a vu beaucoup plus d'utilisation à ce jour, donc je pense que les différences "inélégantes" sont en fait des corrections de bugs. – shoyer

1

Python 2.7 et ont plus tard OrderedDict dans le module collections, donc vous devriez considérer que 'la norme'. Si sa fonctionnalité est suffisante, vous devriez probablement l'utiliser.

Cependant, son approche de mise en œuvre est minimaliste et si cela ne suffit pas, vous devriez regarder odict par Foord/Larossa ou ordereddict (par moi), car dans ce cas, ce sont un meilleur ajustement. Les deux implémentations sont un surensemble de la fonctionnalité fournie par collections.OrderedDict. La différence entre les deux étant, que odict est pure python et ordereddict un module d'extension beaucoup plus rapide C.

Une approche minimaliste n'est pas nécessairement meilleure même si elle fournit toutes les fonctionnalités dont vous avez besoin: par ex. collections.OrderedDict avait initialement un bug lors du retour du repr() d'un OrderedDict imbriqué dans l'une de ses propres valeurs. Un bug qui aurait pu être trouvé plus tôt, avait le sous-ensemble, le petit sous-ensemble OrderedDict peut gérer, des tests unitaires de l'ancien ordereddict été utilisé.

+0

merci pour votre travail, Anthon! J'essayais d'obtenir votre ordereddict, mais les archives zip et tar sur votre site Web étaient mortes. De plus, je suis un peu inquiet si ce projet est toujours vivant? Je veux dire, sera-t-il mis à jour avec le futur Python? Aussi, peut-être, le mettre sur pip pourrait le rendre plus populaire?Je vois 7 fois accélérer sur votre site web, je ne sais pas pourquoi les développeurs Python n'ont pas choisi cette implémentation comme la valeur par défaut de python. – jichi

+0

@jichi Je suis en train de déplacer 'ordereddict' à [bitbucket] (https://bitbucket.org/ruamel/ordereddict) et de le rendre installable avec' pip'. Après tat, je vais aussi regarder la compatibilité Python 3.X (peut-être basée sur une version dépouillée, avec des fonctionnalités plus comme collections.OrderedDict). Les liens sur le site devraient fonctionner à nouveau. – Anthon

+0

super, les liens fonctionnent maintenant. merci pour votre travail! – jichi

2

collections.OrderedDict devrait maintenant être largement disponible, mais si les performances sont préoccupantes, vous pouvez envisager d'utiliser mon paquet cyordereddict comme alternative. C'est un port direct de OrderedDict to Cython de la bibliothèque standard qui est 2-6x plus rapide.

Questions connexes