Get: TypeError: el objeto ‘dict_values’ no admite la indexación cuando se usa python 3.2.3

Este es mi código:

{names[i]:d.values()[i] for i in range(len(names))} 

Esto funciona completamente bien cuando se usa python 2.7.3; sin embargo, cuando uso Python 3.2.3, 'dict_values' object does not support indexing un error que indica que 'dict_values' object does not support indexing . ¿Cómo puedo modificar el código para que sea compatible con 3.2.3?

En Python 3, dict.values() (junto con dict.keys() y dict.items() ) devuelve una view , en lugar de una lista. Vea la documentación aquí . Por lo tanto, debe ajustar su llamada a dict.values() en una llamada a la list manera:

 v = list(d.values()) {names[i]:v[i] for i in range(len(names))} 

Una versión más simple de su código sería:

 dict(zip(names, d.values())) 

Si desea mantener la misma estructura, puede cambiarla a:

 vlst = list(d.values()) {names[i]: vlst[i] for i in range(len(names))} 

(Puede poner fácilmente la list(d.values()) dentro de la comprensión en lugar de vlst ; es un desperdicio hacerlo ya que volvería a generar la lista cada vez).

En Python 3, el método dict.values() devuelve un objeto de vista de diccionario , no una lista como lo hace en Python 2. Las vistas de diccionario tienen una longitud, pueden ser iteradas y admiten la prueba de membresía, pero no admiten la indexación.

Para hacer que su código funcione en ambas versiones, puede utilizar cualquiera de estos:

 {names[i]:value for i,value in enumerate(d.values())} 

o

 values = list(d.values()) {name:values[i] for i,name in enumerate(names)} 

Con mucho, la forma más simple y rápida de hacer lo mismo en cualquiera de las dos versiones sería:

 dict(zip(names, d.values())) 

Sin embargo, tenga en cuenta que todos estos métodos le darán resultados que variarán según el contenido real de d . Para superar eso, puede usar un OrderedDict en su lugar, que recuerda el orden en que las claves se insertaron primero en él, por lo que puede contar con el orden de lo que devuelve el método de values() .