2009-06-18 8 views
6

Duplicar posible:
Python dictionary: are keys() and values() always the same order?¿Dict devolverá las claves y los valores en el mismo orden?

Si tengo un Dictonary en Python, se .keys y .values ​​devolver los elementos correspondientes en el mismo orden?

E.g.

foo = {'foobar' : 1, 'foobar2' : 4, 'kittty' : 34743} 

Para las teclas que devuelve:

>>> foo.keys() 
['foobar2', 'foobar', 'kittty'] 

Ahora se foo.values ​​() devuelven los elementos siempre en el mismo orden que sus teclas correspondientes?

Respuesta

17

Es difícil mejorar la Python documentation:

claves y valores se enumeran en un orden arbitrario, que no es aleatoria, varía a través de implementaciones de Python, y depende de la historia del diccionario de inserciones y deleciones. Si se llaman items(), keys(), values(), iteritems(), iterkeys() y itervalues() sin modificaciones intermedias en el diccionario, las listas se corresponderán directamente. Esto permite la creación de pares (value, key) usando zip(): pairs = zip(d.values(), d.keys()). La misma relación se cumple para los métodos iterkeys() y itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) proporciona el mismo valor para los pares. Otra forma de crear la misma lista es pairs = [(v, k) for (k, v) in d.iteritems()]

Así que, en definitiva, "sí" con la advertencia de que no se debe modificar el diccionario en medio de su llamada a keys() y su llamada a values().

+0

Perfecto soy un idiota. Me perdí completamente ese punto principal. :( – UberJumper

1

Sí, van a

Sólo hay que ver el documento en Python doc:

claves y valores se enumeran en un orden arbitrario, que no es aleatoria, varía a través de implementaciones de Python, y depende del diccionario de historia de inserciones y eliminaciones. Si se invocan items(), keys(), values ​​(), iteritems(), iterkeys() e itervalues ​​() sin modificaciones intermedias en el diccionario, las listas se corresponderán directamente.

mejor que puede hacer es todavía utilizar dict.items()

1

De la documentación Python 2.6:

claves y valores se enumeran en un orden arbitrario que es no aleatoria, varía en las implementaciones de Python y depende del historial de inserciones y eliminaciones del diccionario. Si se llaman items(), keys(), values(), iteritems(), iterkeys() y itervalues() sin modificaciones intermedias en el diccionario, las listas se corresponderán directamente. Esto permite la creación de pares (valor, clave) usando zip(): pairs = zip(d.values(), d.keys()).La misma relación se cumple para los métodos iterkeys() y itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) proporciona el mismo valor para los pares. Otra forma de crear la misma lista es pairs = [(v, k) for (k, v) in d.iteritems()].

Tengo más del 99% de certeza que lo mismo sucederá con Python 3.0.

+0

No es necesario especular sobre Python 3.0. La documentación está aquí: http://docs.python.org/3.0/library/stdtypes.html#dictionary-view-objects y afirmativo. –

Cuestiones relacionadas