2011-03-30 24 views
3

我正在嘗試difflib庫。我有兩個列表:包含字符串的L_1和L_2。我想知道,如果這些序列是相似的(順序不重要)。通過difflib比較python中的列表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的理念和方法

difflib.get_close_matches() 

針對第二列表L_2至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距離我自己的比較。 – 2011-03-30 17:06:13

+0

我以爲difflib在引擎蓋下使用了Levenshtein – fabrizioM 2011-03-30 17:13:10

+0

首先:感謝您的回答!我讀了intern(),但我沒有真正明白它的意思。你會如此善良,給我一個提示嗎? – Aufwind 2011-03-30 17:31:27