2009-04-05 12 views
6

He visto (y escrito) una serie de implementaciones de esto. ¿Hay uno que se considera el mejor o está surgiendo como un estándar?¿Cuál es la implementación de dict mejor ordenada en python?

Lo que quiero decir con ordenado dict es que el objeto tiene algún concepto del orden de las teclas en él, similar a una matriz en PHP.

odict de PEP 372 parece ser un buen candidato, pero no está del todo claro que sea el ganador.

+2

-1: "Mejor" no está definido. –

Respuesta

8

No he visto un estándar; todos parecen tener su propio rol (ver respuestas al this question). Si puede usar el OrderedDictpatch de PEP 372, esa es su mejor opción. Todo lo que se incluye en el stdlib tiene una gran probabilidad de ser lo que todos usan dentro de un año o dos.

12

Ésta es por Raymond Hettinger una gota en sustituto de la collections.OrderedDict que aparecerá en Python 2.7: http://pypi.python.org/pypi/ordereddict

La versión dev de las colecciones de documentos dicen que es equivalente a lo que será en Python 2.7, por lo que es probable que sea una transición suave a la que vendrá con Python.

lo he puesto en PyPI, para que pueda instalarlo con easy_install ordereddict, y usarlo de esta manera:

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

the ordereddict by Raymond Hettinger se ve más corto y más elegante que las colecciones. OrderedDict. Estaba pensando en las colecciones. OrderedDict es mejor que el de Raymond. ¿Cómo es que el que está en el paquete estándar no es tan bueno como el otro? – FrostNovaZzz

+0

@FrostNovaZzz collections.OrderedDict ha visto mucho más uso por ahora, por lo que espero que las diferencias "poco elegantes" sean en realidad correcciones de errores. – shoyer

1

Python 2.7 y más tarde tener OrderedDict en el módulo collections, por lo que debe tener en cuenta que a medida 'estándar'. Si su funcionalidad es suficiente, probablemente deberías estar usando eso.

Sin embargo, su enfoque de implementación es minimalista y, si eso no es suficiente, debería mirar odict por Foord/Larossa o ordereddict (por mí), ya que en ese caso son más adecuados. Ambas implementaciones son un superconjunto de la funcionalidad proporcionada por collections.OrderedDict. La diferencia entre los dos es que odict es python puro y ordereddict un módulo de extensión C mucho más rápido.

Un enfoque minimalista no es necesariamente mejor incluso si proporciona toda la funcionalidad que necesita: p. collections.OrderedDict tenía inicialmente un bug al devolver el repr() de un OrderedDict anidado en uno de sus propios valores. Un error que se pudo haber encontrado antes, si el subconjunto, el pequeño subconjunto OrderedDict puede manejar, de unittest del antiguo ordereddict ha sido utilizado.

+0

gracias por tu trabajo, Anthon! Estaba tratando de obtener tu permiso de orden, pero los archivos zip y tar de tu sitio web estaban muertos. Además, estoy un poco preocupado de que este proyecto aún esté vivo. Quiero decir, ¿se actualizará con el futuro Python? Además, tal vez, ponerlo en pip podría hacerlo más popular?Veo 7 veces más velocidad en su sitio web, no estoy seguro de por qué los desarrolladores de Python no eligieron esta implementación como la predeterminada de Python. – jichi

+0

@jichi Estoy en el proceso de mover 'ordereddict' a [bitbucket] (https://bitbucket.org/ruamel/ordereddict) y hacerlo instalable con' pip'. Después de tat también veré la compatibilidad de Python 3.X (quizás basada en una versión reducida, con una funcionalidad más parecida a collections.OrderedDict). Los enlaces en el sitio web deberían funcionar nuevamente. – Anthon

+0

genial, los enlaces funcionan ahora. ¡gracias por tu trabajo! – jichi

2

collections.OrderedDict ahora debe estar ampliamente disponible, pero si el rendimiento es una preocupación, puede considerar el uso de mi paquete cyordereddict como alternativa. Es un puerto directo de OrderedDict to Cython de biblioteca estándar que es 2-6 veces más rápido.

Cuestiones relacionadas