Python 2.x konvertiert beide Schlüssel in Bytestrings, wenn zwei Schlüssel verglichen werden, um zu testen, ob ein Schlüssel bereits existiert, auf einen Wert zugreift oder einen Wert überschreibt. Ein Schlüssel kann als Unicode gespeichert werden, aber zwei unterschiedliche Unicode-Zeichenfolgen können nicht beide als Schlüssel verwendet werden, wenn sie sich auf identische Bytestrings reduzieren.
In []: d = {'a': 1, u'a': 2}
In []: d
Out[]: {'a': 2}
Sie können in gewissem Sinne Unicode-Schlüssel verwenden.
Unicode Schlüssel werden in Unicode beibehalten:
In []: d2 = {u'a': 1}
In []: d2
Out[]: {u'a': 1}
Sie den Wert mit einem beliebigen Unicode-String zugreifen können oder bytestring dass "gleich" den vorhandenen Schlüssel:
In []: d2[u'a']
Out[]: 1
In []: d2['a']
Out[]: 1
Mit der Taste oder alles, was dem Schlüssel zum Schreiben eines neuen Werts "gleich" ist, wird erfolgreich ausgeführt und der vorhandene Schlüssel wird beibehalten:
In []: d2['a'] = 5
In []: d2
Out[]: {u'a': 5}
Da der Vergleich 'a'
mit einem vorhandenen Schlüssel True
war, wurde der diesem Unicode-Schlüssel entsprechende Wert durch 5
ersetzt. Im ersten Beispiel, das ich gebe, vergleicht der zweite Schlüssel u'a'
im Literal für d
wahrheitsgemäß mit dem zuvor zugewiesenen Schlüssel, so dass der Byte-String 'a'
als Schlüssel beibehalten wurde, aber der Wert wurde mit dem 2
überschrieben.
Ich hatte ähnliche Probleme, wenn ich ein Wörterbuch mit unterschiedlich codierten Versionen desselben "Strings" erstellte und abfragte. Das ist etwas, worauf Sie achten müssen. Nützliche Methoden sind die String-Methoden 'str.encode' und' str.decode'. Und natürlich ist es möglich, dass der Schlüssel im Lexikon einfach nicht existiert und somit nichts mit der eigentlichen Kodierung des Schlüssels zu tun hat. – heltonbiker
Es kann Probleme mit Unicode-Schlüsseln in Python 3.2 geben. – JDong
Wie hast du das gelöst? Ich habe das gleiche Problem in 3.4.2. Ich habe die Schlüssel gedruckt und die Schlüssel sind vorhanden und erhalten immer noch den oben gemeldeten Fehler. Irgendwelche Updates bitte? – Vinodh