2012-07-27 16 views
9

Ist es in Python möglich, Unicode-Zeichen als Schlüssel für ein Wörterbuch zu verwenden? Ich habe kyrillische Wörter in Unicode, die ich als Schlüssel verwendet habe. Wenn ich versuche, einen Wert mit einem Schlüssel zu erhalten, bekomme ich die folgende Rückverfolgung:Wörterbuch mit Schlüsseln in Unicode

Traceback (most recent call last): 
File "baseCreator.py", line 66, in <module> 
    createStoresTable() 
File "baseCreator.py", line 54, in createStoresTable 
    region_id = regions[region] 
KeyError: u'\u041c\u0438\u043d\u0441\u043a/\u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0439\xa0' 
+1

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

+0

Es kann Probleme mit Unicode-Schlüsseln in Python 3.2 geben. – JDong

+0

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

Antwort

6

Ja, es ist möglich. Der Fehler, den Sie erhalten, bedeutet, dass der von Ihnen verwendete Schlüssel in Ihrem Wörterbuch nicht vorhanden ist.

Um zu debuggen, versuchen Sie print in Ihrem Wörterbuch; Sie sehen den Ausdruck jedes Schlüssels, der anzeigt, wie der Schlüssel aussieht.

1

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.

Verwandte Themen