2012-09-29 72 views
1

我tryed執行以下代碼:(在python)SequenceMatcher自定義比較函數

from difflib import SequenceMatcher as sm 
class myint(int): 
    def __cmp__(self , other): 
     return 0 
    def __eq__(self , other): 
     return True 

a = myint(1) 
b = myint(2) 
c = myint(3) 
d = myint(1) 
e = myint(2) 
f = myint(3) 
x = [a,b,c] 
y = [f,e,d] 
q = sm(None,x,y) 

就像你所看到的,在這些代碼我tryed使用自定義的比較函數,每兩個實例,使得myint是平等的。但是,當我使用SequenceMatcher于敏的TWE列出與相同長度的比較,我得到了一個unexepted結果:

>>> q.ratio() 
1: 0.3333333333333333 

,而不是1.0。我看到SequenceMatcher使用數字之間的常規比較而不是我的比較,儘管列表由「myint」類型的對象組成。
如何編寫myint類,以使SequenceMatcher將返回1.0,如已經顯示的那樣?
(或任何其他的想法使用自定義的比較函數SequenceMatcher)

回答

0

看起來你已經有了,問題是:

y = [f,e,d] 

應該

y = [d,e,f] 

當你做這個變化,q.ratio()會返回1

>>> from difflib import SequenceMatcher as sm 
>>> class myint(int): 
...  def __cmp__(self , other): 
...   return 0 
...  def __eq__(self , other): 
...   return True 
... 
>>> a = myint(1) 
>>> b = myint(2) 
>>> c = myint(3) 
>>> d = myint(1) 
>>> e = myint(2) 
>>> f = myint(3) 
>>> x = [a,b,c] 
>>> y = [d,e,f] 
>>> q = sm(None,x,y) 
>>> q.ratio() 
1.0 
+0

當然如果列表ar相同的結果將是1.0。但根據我的自定義比較函數,**列表中的每個**兩個元素是相等的,所以即使y = [f,e,d],結果也應該是1.0。 –