2016-03-18 15 views
0

'u aldım. Kelimeleri ve cümleleri (bu durumda bir sözlük gibi) karşılaştırmak için difflib kullanmayı denedim ve sözlükteki anahtarlarla difflib çıktısını karşılaştırmaya çalıştığımda KeyError'u alıyorum. Birisi bana bunun neden olduğunu açıklayabilir mi? Difflib kullanmıyorken her şey iyi çalışıyor.Unicode dizesinde difflib kullanıldıktan sonra, 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) 

Beklenen çıkışı: kral

Bunun yerine alıyorum: Bu difflib ben böyle bir şey yapmak zaman çünkü garip bir şey yapıyor gibi görünüyor bunun neden

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' 

anlamıyorum Bu, her şey gerektiği gibi çalışır.

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

Unicode str'nin başına 'u' ... ''eklemeniz gerekiyor mu? @MarkTolonen 'assert repr ('kr \ xf3l') == 'kr \\ xf3l'' –

+0

@ TadhgMcDonald-Jensen, hayır OP’in' sort'm_dosyası' kelimelerinden' hack’i almasıydı. str() 'orada yapılacak yanlış şeydi. –

cevap

2

bir sorun, ama word ayıklanması ile difflib ile değil: bir başlık olur çünkü

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' 

Sen sorted_matching_words dönüştürmek gerekir. Her bir tuple elemanı, __repr__ yöntemini kullanarak dizeye dönüştürür, bu yüzden \'dan kaçar. Sadece ilk tuple elemanını almalısınız:

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

özellikle sort_matching_words = str (sıralanmış_dosyalama_dosyaları.pop() [: 1]) 've sonraki iki satırı, 'tuple'ın köşeli parantezlerini kesmek yerine' word = sıralanmış_dosyalama_words.pop()' olarak değiştirin. –

+0

Yardım için teşekkürler. – Gunnm

İlgili konular