Parece que las listas devueltas keys()
y los values()
métodos de un diccionario son siempre un mapeo 1 a 1 (suponiendo que el diccionario no se altere entre llamar a los 2 métodos).
Por ejemplo:
>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
print d[k[i]] == v[i]
True
True
True
Si no altera el diccionario entre llamadas keys()
y llamadas values()
, ¿está mal suponer que el bucle anterior siempre se imprimirá Verdadero? No pude encontrar ninguna documentación que confirme esto.
Respuestas:
Encontró esto:
En la documentación 2.x y documentación 3.x .
fuente
Sí, lo que observó es una propiedad garantizada: las claves (), los valores () y los elementos () devuelven listas en orden congruente si el dict no se altera. iterkeys () & c también iteran en el mismo orden que las listas correspondientes.
fuente
dataframe
ofrece una alternativa en la que los elementos pueden actualizarse o eliminarse, y el orden y las ubicaciones de índice de los elementos en una estructura tipo dict permanecen fijos.Sí, está garantizado en python 2.x :
fuente
Si. A partir de CPython 3.6, los diccionarios devuelven los elementos en el orden en que los insertó .
Ignore la parte que dice que esto es un detalle de implementación. Este comportamiento está garantizado en CPython 3.6 y es necesario para todas las demás implementaciones de Python que comienzan con Python 3.7 .
fuente
Buenas referencias a los documentos. Así es como puede garantizar el pedido, independientemente de la documentación / implementación:
fuente
De acuerdo con http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects , los métodos de claves (), valores () y elementos () de un dict devolverán los iteradores correspondientes cuyas órdenes corresponder. Sin embargo, no puedo encontrar una referencia a la documentación oficial de python 2.x para lo mismo.
Por lo que puedo decir, la respuesta es sí, pero solo en Python 3.0+
fuente
Por lo que vale, algunos códigos de producción muy usados que he escrito se basan en esta suposición y nunca tuve un problema con ellos. Sin embargo, sé que eso no lo hace realidad :-)
Si no quiere correr el riesgo, usaría iteritems () si puede.
fuente
No estaba satisfecho con estas respuestas ya que quería asegurarme de que los valores exportados tuvieran el mismo orden, incluso cuando usaban diferentes dictados.
Aquí puede especificar el orden de las teclas por adelantado, los valores devueltos siempre tendrán el mismo orden, incluso si el dict cambia, o si usa un dict diferente.
fuente