2012-07-27 14 views
9

¿Es posible en Python utilizar caracteres Unicode como claves para un diccionario? Tengo palabras cirílicas en Unicode que utilicé como claves. Cuando trato de obtener un valor con una clave, obtengo la siguiente trazabilidad:Diccionario con claves en 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

Tuve problemas similares cuando creé y consulté un diccionario con versiones codificadas de forma diferente de la misma "cadena". Esto es algo que debes buscar. Los métodos útiles son los métodos de cadena 'str.encode' y' str.decode'. Y, por supuesto, es posible que la clave simplemente no exista en el diccionario, por lo que no tiene nada que ver con la codificación real de la clave. – heltonbiker

+0

Puede haber problemas con las claves Unicode en Python 3.2. – JDong

+0

¿Cómo resolviste esto? Tengo el mismo problema en 3.4.2. He imprimido las claves y las claves están existentes y aún obtengo el error informado anteriormente. ¿Alguna actualización, por favor? – Vinodh

Respuesta

6

Sí, es posible. El error que está recibiendo significa que la clave que está utilizando no existe en su diccionario.

Para depurar, pruebe print ing su diccionario; verá la repr de cada tecla que debe mostrar cómo se ve la clave real.

1

Python 2.x convierte ambas claves en cadenas de bytes al comparar dos claves con el objetivo de comprobar si una clave ya existe, acceder a un valor o sobrescribir un valor. Una clave se puede almacenar como Unicode, pero dos cadenas Unicode distintas no se pueden usar como claves si se reducen a cadenas de bytes idénticas.

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

Puede utilizar teclas Unicode, en algún sentido.

teclas

Unicode son retenidos en Unicode:

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

Se puede acceder al valor con cualquier cadena Unicode o cadena de bytes que "es igual a" la clave existente:

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

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

Utilizando la tecla o cualquier cosa que "sea igual" a la clave para escribir un nuevo valor tendrá éxito y conservará la clave existente:

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

Como la comparación de 'a' con una clave existente era True, el valor correspondiente a esa clave Unicode existente se reemplazó por 5. En el ejemplo inicial que doy, la segunda clave u'a' proporcionada en el literal d se compara con la clave previamente asignada, por lo que la cadena de bytes 'a' se retuvo como la clave pero el valor se sobrescribió con el 2.

Cuestiones relacionadas