2012-07-27 67 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覆蓋。