2017-02-17 4 views
1

У меня есть эта функция:KeyError при использовании не-ASCII символов в качестве ключей в словаре питона

#!/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 "' перед строкой: ex: 'u'á'' или' new = u'''. –

+0

, какую версию python вы используете? На python 3 он работает без потерь, меняя dic [l] на dic.get (l, l) – Wli

+2

Хорошо, ваш вызов печати делает очевидным, что это py2. Синь дал вам ответ – Wli

ответ

3

Вы должны передать слово как объект Юникода, поэтому итерации делается на каждом юникода характер:

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

Кодирование может быть проблематичным в . Вы должны использовать unicode строку всякий раз, когда есть какие-либо не-ASCII символов, участвующие:

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

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

Использование dict.get(key, default) позволяет избежать основных ошибок для всех символов, которые не являются в dic.

Смежные вопросы