2012-07-27 75 views
9

在Python中可以使用Unicode字符作为字典的键吗? 我使用Unicode作为密钥的西里尔字。当试图通过一个键获得一个值时,我得到以下回溯: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

当我用相同的“字符串”的不同编码版本创建和查询一些字典时,我遇到了类似的问题。这是寻找的东西。有用的方法是'str.encode'和'str.decode'字符串方法。当然,密钥可能并不存在于字典中,因此与密钥的实际编码无关。 – heltonbiker 2012-07-27 20:12:15

+0

python 3.2中的unicode键可能存在问题。 – JDong 2015-01-06 00:45:39

+0

你是如何解决这个问题的?我在3.4.2中遇到同样的问题。我已经打印的钥匙和钥匙是存在的,仍然得到上述报告的错误。请更新吗? – Vinodh 2015-06-24 21:32:07

回答

6

是的,这是可能的。您收到的错误意味着您使用的密钥在您的字典中不存在。

要调试,请尝试print ing你的字典;你会看到每个键的repr应该显示实际键的样子。

1

为了测试密钥是否已存在,访问值或覆盖值,在比较两个键时,Python 2.x将这两个键都转换为字节串。密钥可以存储为Unicode,但如果两个不同的Unicode字符串缩减为相同的字节串,则不能同时用作密钥。

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

在某种意义上,您可以使用Unicode密钥。

Unicode的关键字将保留在Unicode中:

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

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

使用钥匙或:

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

你可以使用任何Unicode字符串字节字符串是 “等于” 现有的密钥访问值任何“等于”写入新值的密钥都将成功并保留现有密钥:

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

由于将'a'与现有密钥进行比较的结果为True,因此将与该现有Unicode密钥对应的值替换为5。在我给出的初始示例中,d的文字中提供的第二个键u'a'与以前分配的键相比较,因此字符串'a'保留为键,但值被2覆盖。