2016-03-18 2 views
0

Ich habe versucht, Difflib zu verwenden, um Wörter und Sätze zu vergleichen (in diesem Fall so etwas wie Wörterbuch) und wenn ich difflib Ausgabe mit Schlüsseln im Wörterbuch zu vergleichen, bekomme ich KeyError. Kann mir jemand erklären, warum das passiert? Wenn ich nicht difflib benutze, funktioniert alles gut.Warum nach der Verwendung von Difflib auf Unicode-String bekomme ich 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) 

Erwartete Ausgabe: König

Statt, dass ich bekommen:

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' 

Ich verstehe nicht, warum dies geschieht es sieht aus wie difflib etwas komisch, weil tut, wenn ich etwas tun, wie dies:

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 

Alles funktioniert wie vorgesehen.

+0

ist es möglich, müssen Sie 'u '...'' an den Anfang der Unicode-str hinzufügen? @ MarkTolonen 'behaupten, repr ('kr \ xf3l') == 'kr \\ xf3l'' –

+0

@ TadhgMcDonald-Jensen, nein, es war OP's Hack, um' Wort' aus 'sorted_matching_words' zu bekommen. 'str()' war dort das Falsche. –

Antwort

2

Das Problem ist nicht mit dem difflib, aber word mit extra:

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' 

Sie nicht sorted_matching_words umwandeln sollte, weil es ein Tupel. Jedes Tupelelement wird unter Verwendung einer __repr__-Methode in die Zeichenfolge konvertiert, weshalb es \ entkommt. Sie sollten nur das erste Tupel-Element nehmen:

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

Ändern Sie speziell 'sorted_matching_words = str (sorted_matching_words.pop() [: 1])' und die nächsten zwei Zeilen zu nur 'word = sorted_matching_words.pop()' statt die Klammern des Tupels abschneiden. –

+0

Funktioniert super danke für Hilfe. – Gunnm

Verwandte Themen