2012-07-08 17 views
6

Jak odróżnić case od difflib.get_close_matches()? Mam słownik, który ma zdefiniowany format, który obejmuje wielkie litery. Jednak ciąg testowy może mieć pełną wielkość liter lub brak wielkich liter, a te powinny być równoważne. Wyniki muszą być jednak poprawnie napisane wielkimi literami, więc nie mogę używać zmodyfikowanego słownika.Ignoruj ​​wielkość liter z difflib.get_close_matches()

import difflib 

names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John', 
    'Acacia koa A.Gray var. waianaeensis H.St.John', 
    'Acacia koaia Hillebr.', 
    'Acacia kochii W.Fitzg. ex Ewart & Jean White', 
    'Acacia kochii W.Fitzg.'] 
s = 'Acacia kochi W.Fitzg.' 

# base case: proper capitalisation 
print(difflib.get_close_matches(s,names,1,0.9)) 

# this should be equivalent from the perspective of my program 
print(difflib.get_close_matches(s.upper(),names,1,0.9)) 

# this won't work because of the dictionary formatting 
print(difflib.get_close_matches(s.upper().capitalize(),names,1,0.9)) 

wyjściowa:

['Acacia kochii W.Fitzg.'] 
[] 
[] 

kod robocza:

podstawie odpowiedzi Hugh Bothwell za, mam zmodyfikował kod w następujący sposób, aby uzyskać roztwór roboczy (które powinny również działać, gdy więcej niż jeden wynik jest zwracany):

import difflib 

names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John', 
    'Acacia koa A.Gray var. waianaeensis H.St.John', 
    'Acacia koaia Hillebr.', 
    'Acacia kochii W.Fitzg. ex Ewart & Jean White', 
    'Acacia kochii W.Fitzg.'] 
test = {n.lower():n for n in names}  
s1 = 'Acacia kochi W.Fitzg.' # base case 
s2 = 'ACACIA KOCHI W.FITZG.' # test case 

results = [test[r] for r in difflib.get_close_matches(s1.lower(),test,1,0.9)] 
results += [test[r] for r in difflib.get_close_matches(s2.lower(),test,1,0.9)] 
print results 

Wyjście:

['Acacia kochii W.Fitzg.', 'Acacia kochii W.Fitzg.'] 
+0

Przepraszamy za ponowne uruchomienie starego posta, ale uznałem to za interesujące. W przypadku końcowego produktu do wyszukiwania czytam kod i wygląda na to, że nie potrzebujesz pierwszej i drugiej listy wyników. Czy to jest poprawne? Wygląda na to, że algorytm wygenerowałby pożądany rezultat bez tych linii. –

+0

@TylerRussell to prawda. Celem było sprawdzenie, czy wielkość liter w wyszukiwaniu nie wpłynęła na wynik. Fakt, że wyszukiwanie za pomocą s1 i wyszukiwanie za pomocą s2 dało taki sam wynik, pokazało, że algorytm zadziałał. Zwykle używałbyś tylko jednego wyszukiwanego hasła. – rudivonstaden

Odpowiedz

7

Nie widzę żadnego szybkiego sposobu na porównanie difflib z wielkością liter.

szybkiego i brzydka rozwiązanie wydaje się być

  • utworzyć funkcję, która przekształca ciąg do niektórych postaci kanonicznej (na przykład górną część obudowy, wolny rozmieszczonych interpunkcyjnych)

  • użyj tej funkcji, aby utworzyć ciąg {kanonicznego ciągu: oryginalny ciąg} i listę [ciągu kanonicznego]

  • uruchom .get_close_match na liście kanonicznej, następnie podłącz wyniki przez dyktando, aby uzyskać pochodzenie al stringi wstecz

+0

Dzięki. To nie jest eleganckie, ale działa! – rudivonstaden

Powiązane problemy