2009-05-07 13 views
198

Parece que las listas devueltas por keys() y values() métodos de un diccionario son siempre una asignación de 1 a 1 (suponiendo que el diccionario no se altera entre llamar a los 2 métodos).Diccionario de Python: ¿las claves() y los valores() siempre tienen el mismo orden?

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 alteran el diccionario keys() entre llamar y llamar a values(), es erróneo suponer lo anterior para bucle siempre imprimir Es cierto? No pude encontrar ninguna documentación que confirmara esto.

+0

Nota al margen: para generar una lista de los valores, tendría que pasar por la lista de claves, de todos modos. ;) –

+3

Todas las respuestas indican claramente que la respuesta es "sí, siempre el mismo orden", pero ¿qué orden es eso? Obviamente, el orden de la función hash, pero ¿es eso predecible? – naught101

+1

@ naught101 el orden de la función hash es [no destinado a depender de] (https://docs.python.org/3/tutorial/datastructures.html#dictionaries). Si se desea un orden, [OrderedDict] (https://docs.python.org/3.6/library/collections.html#collections.OrderedDict) sería el camino a seguir. – Marc

Respuesta

225

encontrado esto:

Si items(), keys(), values(), iteritems(), iterkeys(), y itervalues() son llamados sin modificaciones que intervienen al diccionario , las listas de manera directa corresponden.

En 2.x documentation y 3.x documentation.

+10

Sospecho que has sido votado negativamente, nosklo, porque tu respuesta es casi palabra por palabra apphacker, con la excepción del enlace. Si respondió 1 hora después de él, mucha gente sentirá que no podría haber "encontrado esto", pero que vio su respuesta, y en lugar de señalar que tenía el enlace equivocado, decidió publicar el suyo. El apphacker de información citado en su respuesta está correctamente en el enlace, simplemente lo etiquetó erróneamente como py2.x ... en este caso, el equivalente de un error inofensivo cuando la palabra es claramente reconocible. Su respuesta puede parecer avariciosa en ese contexto. –

+1

@Jarret Hardie: Bueno, las preguntas están llenas de respuestas correctas duplicadas. Nunca he votado negativamente ninguna respuesta si es correcta. Simplemente no los renuncio. – nosklo

+0

@Jarret Hardie: ¿Y quién dijo que eso es apphacker? Él fue el que publicó una nueva respuesta en lugar de editar la de Sykora. Incluso dejó un comentario. – nosklo

66

Sí, lo que ha observado es de hecho una propiedad garantizada - keys(), values ​​() y items() devuelven listas en orden congruente si el dict no se altera. iterkeys() & c también iteran en el mismo orden que las listas correspondientes.

6

De acuerdo con http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects, los métodos keys(), values ​​() y items() de un dict devolverán los iteradores correspondientes cuyas órdenes corresponden. Sin embargo, no puedo encontrar una referencia a la documentación oficial de Python 2.x para la misma cosa.

Así que por lo que yo puedo decir, la respuesta es sí, pero sólo en Python 3.0 +

+0

garantizado en python 2, ver a continuación. –

+4

Respuestas cambio, las instrucciones no funcionan – Casebash

40

sí lo es guaranteed in python 2.x:

Si las claves, valores y puntos de vista artículos se repiten a lo largo sin interviniendo modificaciones en el diccionario, el orden de los artículos directamente corresponde.

6

Por lo que vale, algunos de los códigos de producción usados ​​que he escrito están basados ​​en esta suposición y nunca he tenido ningún problema. Sé que eso no lo hace realidad :-)

Si no quieres arriesgarte, usaría iteritems() si puedes.

for key, value in myDictionary.iteritems(): 
    print key, value 
-1

No estaba satisfecho con estas respuestas, ya que quería asegurarme de que los valores exportados tenían el mismo orden incluso cuando se usaban diferentes dicts.

Aquí especifica el orden de las llaves por adelantado, los valores devueltos siempre tendrán el mismo orden incluso si el dict cambia, o si usa un dict diferente.

keys = dict1.keys() 
ordered_keys1 = [dict1[cur_key] for cur_key in keys] 
ordered_keys2 = [dict2[cur_key] for cur_key in keys] 
Cuestiones relacionadas