Hay una función existente que termina en lo siguiente, donde d
hay un diccionario:
return d.iteritems()
que devuelve un iterador sin clasificar para un diccionario dado. Me gustaría devolver un iterador que recorra los elementos ordenados por clave . ¿Cómo puedo hacer eso?
python
sorting
dictionary
Miguel
fuente
fuente
.items()
lugar deiteritems()
: como dijo @Claudiu, iteritems no funciona para Python 3.x, peroitems()
está disponible desde Python 2.6.items()
crea una lista y, por lo tanto, usa memoria, mientras queiteritems()
esencialmente no usa memoria. Lo que debe usar depende principalmente del tamaño del diccionario. Además, la herramienta de conversión automática de Python 2 a Python 3 (2to3
) se encarga automáticamente de la conversión deiteritems()
aitems()
, por lo que no hay necesidad de preocuparse por esto.collections.OrderedDict
luego ordena una vez y obtiene los elementos en orden ordenado siempre.iteritems()
no usa memoria, todo se debe extraer de la memoriasorted()
, por lo que no hay diferencia entre el uso de la memoriaitems()
yiteritems()
aquí.items()
(en la lista devuelta poritems()
y en la lista ordenada) y solo una vez coniteritems()
(solo en la lista ordenada).Usa la
sorted()
función:Si desea un iterador real sobre los resultados ordenados, ya que
sorted()
devuelve una lista, use:fuente
Las claves de un dict se almacenan en una tabla hash, por lo que es su "orden natural", es decir, psuedo-random. Cualquier otro pedido es un concepto del consumidor del dict.
sorted () siempre devuelve una lista, no un dict. Si le pasa un dict.items () (que produce una lista de tuplas), devolverá una lista de tuplas [(k1, v1), (k2, v2), ...] que se pueden usar en un bucle de una manera muy parecida a un dict, pero de todos modos no es un dict !
Lo siguiente se siente como un dict en un bucle, pero no lo es, es una lista de tuplas que se descomprimen en k, v:
Aproximadamente equivalente a:
fuente
sorted(foo.keys())
es mejor como equivalentesorted(foo)
, ya que los diccionarios devuelven sus claves cuando se repiten (con la ventaja de no verse obligados a crear lafoo.keys()
lista intermedia, tal vez, dependiendo de cómosorted()
se implemente para los iterables).k in sorted(foo.keys()):
que tira las llaves ofor k,v in sorted(foo.items()):
que devuelve una copia de la lista de pares del diccionario Conjeturaríasorted(foo.keys())
La respuesta de Greg es correcta. Tenga en cuenta que en Python 3.0 tendrá que hacer
como
iteritems
se habrá idofuente
Ahora puede usar también
OrderedDict
en Python 2.7:Aquí tienes la página de novedades para la versión 2.7 y la API OrderedDict .
fuente
En general, uno puede ordenar un dict así:
Para el caso específico en la pregunta, que tiene una "caída de reemplazo" para d.iteritems (), agregue una función como:
y entonces la línea final cambia de
a
o
fuente
Este método todavía tiene una clasificación O (N log N), sin embargo, después de un breve heapify lineal, produce los elementos en orden ordenado a medida que avanza, haciéndolo teóricamente más eficiente cuando no siempre necesita la lista completa.
fuente
Si desea ordenar por el orden en que se insertaron los elementos en lugar del orden de las teclas, debe echar un vistazo a las colecciones de Python . (Solo Python 3)
fuente
sorted devuelve una lista, de ahí su error cuando intenta iterar sobre ella, pero debido a que no puede ordenar un dict tendrá que lidiar con una lista.
No tengo idea de cuál es el contexto más amplio de su código, pero podría intentar agregar un iterador a la lista resultante. ¿Tal vez así?
por supuesto, volverás a recibir tuplas ahora porque ordenado convirtió tu dict en una lista de tuplas
ex: digamos que su dict fue:
{'a':1,'c':3,'b':2}
ordenado lo convierte en una lista:así que cuando iteras sobre la lista obtienes (en este ejemplo) una tupla compuesta de una cadena y un entero, pero al menos podrás iterar sobre ella.
fuente
Suponiendo que está utilizando CPython 2.xy un mydict de diccionario grande, usar sorted (mydict) será lento porque sorted crea una lista ordenada de las claves de mydict.
En ese caso, es posible que desee consultar el paquete de mi pedido ordenado que incluye una implementación de
sorteddict
C en C. Especialmente si tiene que revisar la lista ordenada de claves varias veces en diferentes etapas (es decir, número de elementos) de la vida útil de los diccionarios.http://anthon.home.xs4all.nl/Python/ordereddict/
fuente