web-dev-qa-db-fra.com

Get: TypeError: L'objet 'dict_values' ne prend pas en charge l'indexation lors de l'utilisation de python 3.2.3

Ceci est mon code:

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

Cela fonctionne parfaitement si vous utilisez python 2.7.3; cependant, lorsque j’utilise python 3.2.3, j’obtiens une erreur en indiquant 'dict_values' object does not support indexing. Comment puis-je modifier le code pour le rendre compatible pour 3.2.3?

91
Jesse Pet

Dans Python 3, dict.values() (ainsi que dict.keys() et dict.items())) renvoie un view plutôt que Voir la documentation ici . Vous devez donc encapsuler votre appel à dict.values() dans un appel à list comme suit:

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

Une version plus simple de votre code serait:

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

Si vous souhaitez conserver la même structure, vous pouvez la modifier comme suit:

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

(Vous pouvez tout aussi facilement insérer list(d.values()) dans la compréhension au lieu de vlst; cela ne sert à rien de le faire car cela générerait à nouveau la liste à chaque fois).

12
David Robinson

Dans Python 3, la méthode dict.values() renvoie un objet de vue du dictionnaire , et non une liste semblable à celle utilisée dans Python 2. Les vues de dictionnaire ont une longueur, peuvent être itérées et prennent en charge le test d'adhésion, mais ne prennent pas en charge l'indexation.

Pour que votre code fonctionne dans les deux versions, vous pouvez utiliser l’un des deux suivants:

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

ou

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

Le moyen le plus simple et le plus rapide de faire la même chose dans l'une ou l'autre version serait:

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

Notez cependant que toutes ces méthodes vous donneront des résultats qui varieront en fonction du contenu réel de d. Pour résoudre ce problème, vous pouvez utiliser plutôt OrderedDict , qui mémorise l'ordre dans lequel les clés ont été insérées pour la première fois. Vous pouvez donc compter sur l'ordre de ce qui est retourné par le values() méthode.

7
martineau