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
.
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
Puede haber problemas con las claves Unicode en Python 3.2. – JDong
¿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