2012-07-27 13 views
9

辞書のキーとして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

+0

Python 3.2でユニコードキーに問題がある可能性があります。 – JDong

+0

どうやってこれを解決しましたか?私は3.4.2で同じ問題があります。私はキーを印刷しており、キーは存在していて、上記のエラーが報告されています。 – Vinodh

答えて

6

はい、可能です。取得しているエラーは、使用しているキーが辞書に存在しないことを意味します。

デバッグするには、print辞書を試してください。実際のキーの外観を示すはずの各キーのreprが表示されます。

1

Python 2.xは、キーがすでに存在するかどうかをテストしたり、値にアクセスしたり、値を上書きする目的で2つのキーを比較するときに、両方のキーをバイトタスクに変換します。キーはUnicodeとして格納できますが、2つの別個の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のリテラルで提供されている2番目のキーu'a'は、真に以前に割り当てられたキーと比較されるため、'a'のバイトコードがキーとして保持されましたが、値は2で上書きされていました。