2012-07-27 33 views
9

Có thể sử dụng Python để sử dụng các ký tự Unicode làm khóa cho từ điển không? Tôi có các từ Cyrillic trong Unicode mà tôi sử dụng làm khóa. Khi cố gắng lấy giá trị bằng khóa, tôi nhận được thông tin truy nguyên sau:Từ điển có các phím trong 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

Tôi gặp sự cố tương tự khi tạo và truy vấn một số từ điển với các phiên bản được mã hóa khác nhau của cùng một "chuỗi". Đây là một cái gì đó để tìm kiếm. Các phương thức hữu ích là các phương thức chuỗi 'str.encode' và' str.decode'. Và, tất nhiên, có thể là chìa khóa chỉ đơn giản là không tồn tại trong từ điển, do đó không có gì để làm với mã hóa thực tế của khóa. – heltonbiker

+0

Có thể có vấn đề với các khóa unicode trong python 3.2. – JDong

+0

Bạn đã giải quyết vấn đề này bằng cách nào? Tôi có cùng một vấn đề trong 3.4.2. Tôi đã in các phím và các phím có sẵn và vẫn nhận được báo cáo ở trên error.Any cập nhật xin vui lòng? – Vinodh

Trả lời

6

Có, có thể. Lỗi bạn đang nhận có nghĩa là khóa bạn đang sử dụng không tồn tại trong từ điển của bạn.

Để gỡ lỗi, hãy thử print nhập từ điển của bạn; bạn sẽ thấy repr của mỗi khóa sẽ hiển thị khóa thực tế trông như thế nào.

1

Python 2.x chuyển đổi cả hai khóa thành mã xác nhận khi so sánh hai khóa cho mục đích kiểm tra xem khóa đã tồn tại chưa, truy cập giá trị hoặc ghi đè giá trị. Một khóa có thể được lưu trữ dưới dạng Unicode, nhưng hai chuỗi Unicode riêng biệt không thể được sử dụng như là các khóa nếu chúng giảm xuống thành các chuỗi giống nhau.

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

Bạn có thể sử dụng các phím Unicode theo một nghĩa nào đó.

phím

Unicode được giữ lại trong Unicode:

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

Bạn có thể truy cập vào các giá trị với bất kỳ chuỗi Unicode hoặc bytestring rằng "bằng" chìa khóa hiện có:

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

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

Sử dụng phím hoặc bất kỳ điều gì "bằng" khóa để viết giá trị mới sẽ thành công và giữ lại khóa hiện tại:

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

Bởi vì so sánh 'a' với khóa hiện tại là True, giá trị tương ứng với khóa Unicode hiện có đã được thay thế bằng 5. Trong ví dụ ban đầu tôi đưa ra, khóa thứ hai u'a' được cung cấp bằng chữ cho số d so sánh trung thực với khóa đã gán trước đó, do đó, mã kiểm tra 'a' được giữ lại làm khóa nhưng giá trị được ghi đè bằng 2.

Các vấn đề liên quan