2011-03-30 2 views
3

difflib 라이브러리를 시험 중이다. L_1과 L_2 문자열이 포함 된 두 개의 목록이 있습니다. 나는 그 서열이 비슷하다면 (순서는 중요하지 않음) 알고 싶다.difflib modul에 의한 파이썬리스트 비교

L_1 = ["Bob", "Mary", "Hans"] 
L_2 = ["Bob", "Marie", "Háns"] 

확인해야합니다. 하지만

L_1 = ["Nirdosch", "Mary", "Rolf"] 
L_2 = ["Bob", "Marie", "Háns"] 

이 아니어야합니다.

나는 첫 번째 목록 L_1 반복의 아이디어를 내놓았다와 두 번째 목록 L_2에 대한 방법

difflib.get_close_matches() 

에 의해 L_1의 모든 요소와 일치 할 수 있습니다. 비율이 더 큰 일치 항목이 있으면 0.7을 L_2에서 제거하고 계속 진행한다고합시다. 그러나 나는 그것이 좋은 계획이라고는 생각하지 않는다. 더 좋은가요? 나는 같은 것을 할 것

답변

3

:

import difflib 

L_1 = ["Bob", "Mary", "Hans"] 
L_2 = ["Bob", "Marie", "Hans"] 

def similiarity(L_1, L_2): 
    L_1 = set(intern(w) for w in L_1) 
    L_2 = set(intern(w) for w in L_2) 

    to_match = L_1.difference(L_2) 
    against = L_2.difference(L_1) 
    for w in to_match: 
     res = difflib.get_close_matches(w, against) 
     if len(res): 
      against.remove(res[0]) 
    return (len(L_2)-len(against))/(len(L_1)) 

print similiarity(L_1,L_2) 
+0

니스 솔루션 - 그러나 나는 일반적으로 Levenshtein 거리에 따라 내 자신의 비교를 구현합니다. –

+0

difflib가 Levenshtein을 두포로 사용한다고 생각했습니다 – fabrizioM

+0

첫 번째 : 답변 해 주셔서 감사합니다! 나는 인턴()에서 읽었지만, 그것이 의미하는 바를 실제로 얻지 못했습니다. 당신은 너무 친절하고 나에게 힌트를 주시겠습니까? – Aufwind