2016-03-18 4 views
0

Я попытался использовать difflib для сравнения слов и предложений (в данном случае что-то вроде словаря), и когда я пытаюсь сравнить вывод difflib с ключами в словаре, я получаю KeyError. Может ли кто-нибудь объяснить мне, почему это происходит? Когда я не использую difflib, все работает нормально.Почему после использования difflib в строке unicode я получаю KeyError

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
import difflib 
import operator 

lst = ['król'] 
word = 'król' 

dct = {} 
for order in lst: 
    word_match_ratio = difflib.SequenceMatcher(None, word, order).ratio() 

    dct[order] = word_match_ratio 
    print order 
    print('%s %s' % (order, word_match_ratio)) 


sorted_matching_words = sorted(dct.items(), key=operator.itemgetter(1)) 
sorted_matching_words = str(sorted_matching_words.pop()[:1]) 
x = len(sorted_matching_words) - 3 
word = sorted_matching_words[3:x] 

print word 


def translate(someword): 
    someword = trans_dct[someword] 
    print(someword) 
    return someword 

trans_dct = { 
    "król": 'king' 
} 
print trans_dct 
word = translate(word) 

Ожидаемый результат: король

Вместо того, что я получаю:

Traceback (most recent call last): 
    File "D:/Python/Testing stuff.py", line 64, in <module> 
    word = translate(word) 
    File "D:/Python/Playground/Testing stuff.py", line 56, in translate 
    someword = trans_dct[someword] 
KeyError: 'kr\\xf3l' 

Я не понимаю, почему это происходит, похоже, difflib делает что-то странно, потому что, когда я делаю что-то вроде это:

uni = 'kr\xf3l' 
print uni 


def translate(word): 
    word = dct1[word] 
    print(word) 
    return word 

dct1 = { 
    "król": 'king' 
} 
print dct1 
word = translate('kr\xf3l') 
print word 

Все работает по назначению.

+0

Возможно, вам нужно добавить 'u '...'' в начало строки unicode? @MarkTolonen 'assert repr ('kr \ xf3l') == 'kr \\ xf3l'' –

+0

@ TadhgMcDonald-Jensen, нет, это был взломан OP, чтобы получить слово из' sorted_matching_words'. 'str()' было неправильным делом. –

ответ

2

Проблема не с difflib, но с извлекая word:

sorted_matching_words = sorted(dct.items(), key=operator.itemgetter(1)) 
# sorted_matching_words = (u'kr\xf3l',) 

sorted_matching_words = str(sorted_matching_words.pop()[:1]) 
# sorted_matching_words = "(u'kr\\xf3l',)" 

x = len(sorted_matching_words) - 3 
word = sorted_matching_words[3:x] 
# word = 'kr\\xf3l' 

Вы не должны преобразовать sorted_matching_words, потому что это кортеж. Каждый элемент кортежа преобразуется в строку с использованием метода __repr__, поэтому он избегает \. Вам нужно просто взять первый элемент кортежа:

In [34]: translate(sorted_matching_words[-1][0]) 
king 
Out[34]: u'king' 
+1

специально меняют 'sorted_matching_words = str (sorted_matching_words.pop() [: 1])' и следующие две строки только на 'word = sorted_matching_words.pop()' вместо того, чтобы отсекать скобки кортежа. –

+0

Огромное спасибо за помощь. – Gunnm

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

  • Нет связанных вопросов^_^