2012-07-27 20 views
9

E 'possibile in Python utilizzare i caratteri Unicode come chiavi per un dizionario? Ho parole in cirillico in Unicode che ho usato come chiavi. Quando cerco di ottenere un valore tramite una chiave, ottengo il seguente traceback:Dizionario con le chiavi 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

Ho avuto problemi simili quando ho creato e interrogato un dizionario con versioni codificate in modo diverso della stessa "stringa". Questo è qualcosa da cercare. Metodi utili sono i metodi di stringa 'str.encode' e' str.decode'. E, naturalmente, è possibile che la chiave semplicemente non esista nel dizionario, non avendo quindi nulla a che fare con la vera codifica della chiave. – heltonbiker

+0

Potrebbero esserci problemi con le chiavi unicode in python 3.2. – JDong

+0

Come hai risolto questo? Ho lo stesso problema in 3.4.2. Ho stampato le chiavi e le chiavi sono già presenti e ricevo comunque l'errore sopra riportato. Qualche aggiornamento per favore? – Vinodh

risposta

6

Sì, è possibile. L'errore che stai ricevendo significa che la chiave che stai utilizzando non esiste nel tuo dizionario.

Per eseguire il debug, provare il dizionario print; vedrai il repr di ciascuna chiave che dovrebbe mostrare come appare la chiave attuale.

1

Python 2.x converte entrambe le chiavi in ​​estensioni quando si confrontano due chiavi allo scopo di verificare se esiste già una chiave, accedere a un valore o sovrascrivere un valore. Una chiave può essere memorizzata come Unicode, ma due stringhe Unicode distinte non possono essere utilizzate entrambe come chiavi se si riducono a identici bytestrings.

In []: d = {'a': 1, u'a': 2} 
In []: d 
Out[]: {'a': 2} 

È possibile utilizzare le chiavi Unicode, in un certo senso.

chiavi

Unicode vengono mantenuti in Unicode:

In []: d2 = {u'a': 1} 
In []: d2 
Out[]: {u'a': 1} 

È possibile accedere al valore con qualsiasi stringa Unicode o bytestring che "è uguale a" la chiave esistente:

In []: d2[u'a'] 
Out[]: 1 

In []: d2['a'] 
Out[]: 1 

Con il tasto o tutto ciò che "equivale" alla chiave per scrivere un nuovo valore avrà successo e conserverà la chiave esistente:

In []: d2['a'] = 5 
In []: d2 
Out[]: {u'a': 5} 

Poiché il confronto di 'a' in una chiave esistente era True, il valore corrispondente a quella chiave Unicode esistente è stato sostituito con 5. Nell'esempio iniziale che ho fornito, il secondo tasto u'a' fornito nel letterale per d si confronta in modo veritiero con la chiave assegnata in precedenza, pertanto il test 'a' è stato mantenuto come chiave ma il valore è stato sovrascritto con 2.

Problemi correlati