it-swarm.com.de

Get: TypeError: Das Objekt 'dict_values' unterstützt keine Indizierung bei Verwendung von python 3.2.3

Das ist mein Code:

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

Dies funktioniert einwandfrei, wenn python 2.7.3 verwendet wird; wenn ich jedoch python 3.2.3 verwende, erhalte ich die Fehlermeldung 'dict_values' object does not support indexing. Wie kann ich den Code so ändern, dass er mit 3.2.3 kompatibel ist?

91
Jesse Pet

In Python 3, dict.values() (zusammen mit dict.keys() und dict.items()) wird ein view zurückgegeben, nicht Eine Liste finden Sie in der Dokumentation hier . Sie müssen daher Ihren Aufruf von dict.values() in einen Aufruf von list wie folgt umbrechen:

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

Eine einfachere Version Ihres Codes wäre:

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

Wenn Sie die gleiche Struktur beibehalten möchten, können Sie sie in Folgendes ändern:

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

(Sie können list(d.values()) genauso einfach in das Verständnis einfügen, anstatt vlst; dies ist nur eine Verschwendung, da die Liste jedes Mal neu generiert wird.).

12
David Robinson

In Python 3 gibt die Methode dict.values() ein Dictionary-Ansichtsobjekt zurück, keine Liste wie in Python 2. Wörterbuchansichten haben eine Länge, können iteriert werden und unterstützen Mitgliedschaftstests, unterstützen jedoch keine Indizierung.

Damit Ihr Code in beiden Versionen funktioniert, können Sie eine der folgenden Methoden verwenden:

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

oder

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

Der mit Abstand einfachste und schnellste Weg, in beiden Versionen dasselbe zu tun, wäre:

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

Beachten Sie jedoch, dass alle diese Methoden Ergebnisse liefern, die vom tatsächlichen Inhalt von d abhängen. Um dies zu überwinden, können Sie stattdessen ein OrderedDict verwenden, das sich an die Reihenfolge erinnert, in der die Schlüssel zuerst eingefügt wurden, sodass Sie sich auf die Reihenfolge verlassen können, in der values() Methode.

7
martineau