2017-02-17 6 views
1

を非ASCII文字を使用したとき、私はこの機能を持っている:KeyError例外をPythonの辞書にキーとして

#!/usr/bin/python 
# coding=UTF-8 

def filt(word): 
    dic = {'á':'a','é':'e','í':'i','ó':'o','ú':'u'} 
    new = '' 
    for l in word: 
     new = new + dic[l] 
    return new 

をしかし、私はいくつかの文字列(例えば「árvore」)のための関数を呼び出して、スクリプトを実行すると、私が取得しますこれは:

Traceback (most recent call last): File "filt.py", line 11, in print filt("árvore") File "filt.py", line 8, in filt new = new + dic[l] KeyError: '\xc3'

何が問題なのですか?

+1

ユニコード文字列の場合は、文字列の前に '' u "'が必要です。例: 'u'á''または' new = u'''です。 –

+0

あなたはどのバージョンのPythonを使用していますか? Python 3では、dic [l]をdic.get(l、l)に変更することで、無駄なく動作します。 – Wli

+2

あなたの印刷呼び出しはpy2であることを明白にします。新はあなたに答えを与えた – Wli

答えて

3

あなたはUnicodeオブジェクトとして単語を渡す必要があり、その反復は各ユニコード文字に行われます。

def filt(word): 
    dic = {u'á':'a', u'é':'e', u'í':'i', u'ó':'o', u'ú':'u'} 
    new = '' 
    for l in word: 
     new = new + dic.get(l, l) 
    return new 

print(filt(u"árvore")) 
#  ^
# arvore 

または文字列に反復する前にword.decode('utf8')を使用しています。

辞書キーも更新することを忘れずに、辞書キーでない項目についてはdict.getを使用して元のオブジェクトを返します。

0

符号化は、で面倒なことがあります。関係するすべての非ASCII文字がある時はいつでもあなたはunicode文字列を使用する必要があります。dict.get(key, default)を使用して

def filt(word): 
    dic = dict(zip(u'áéíóú', u'aeiou')) 
    return u''.join(dic.get(l, l) for l in word) 

> filt(u'árvore') 
'arvore' 

dicに含まれていないすべての文字のキーのエラーを回避できます。

関連する問題