2012-07-11 76 views
0

我有兩個列表,下面,我想比較如果單詞levenshtein距離小於2.我有一個函數來找到levenshtein距離,但作爲它需要的參數這兩個字。我可以找到哪些單詞不在另一個列表中,但它沒有幫助。我可以通過指數去指數,但如下面的情況下,當我到達指數7(但除了除外),所有事情都被拋棄了,因爲不忠將是指數9和8,而wcop88是9和10,因此這些不會被比較。有什麼方法可以說,如果不忠的一部分在另一個列表中的某個詞中,然後檢查這兩個,請注意這並不總是奏效,因爲如果說不忠和感染只有in和ty可以匹配,許多單詞可以可能匹配levenshtein與python列表中的項目的距離

[u'rt', u'cuaimatizada', u's', u'cuaimaqueserespeta', u'forgives', u'any', u'mistake', u'but', u'the', u'infidelity', u'wocp88'] 
[u'rt', u'cuiamatizada', u's', u'cuimaqueserespeta', u'forgive', u'any', u'mistake', u'except', u'infedelity', u'wcop88'] 

編輯:所以我的目標是能夠養活我的萊文斯坦功能這兩個詞需要進行檢查。在這種情況下,以下配對:

u'cuaimatizada  u'cuiamatizada 

u'cuaimaqueserespeta u'cuimaqueserespeta 

u'forgives u'forgive 

u'infedelity u'infidelity 

u'wocp88 u'wcop88 

我不知道前面哪個單詞。

+2

?你的目標是什麼? – 2012-07-11 16:28:12

+0

林不知道你想要麼...你在找'zip(list1,list2)'? – 2012-07-11 16:31:49

+0

我編輯了我的目標 – jacobLoz 2012-07-11 16:33:35

回答

2

我想這是你想要的......但你能澄清這個問題有點比較所有的話......不只是匹配索引

wordpairs = [(w1,w2) for w1 in list1 for w2 in list2 if levenstein(w1,w2) < 2] 

>>> matches = [(w1,w2) for w1 in l12 for w2 in l22 if levenshtein(w1,w2) < 2] 

[(u'rt', u'rt'), (u's', u's'), (u'cuaimaqueserespeta', u'cuimaqueserespeta'), (u'forgives', u'forgive'), (u'any', u'any'), (u'mistake', u'mistake'), (u'infidelity',u'infedelity')] 
+1

或...'過濾器(lambda i:levenshtein(* i),itertools.product(list1,list2))' – 2012-07-11 16:48:03

+1

這可能更快,所以+1 ...雖然我認爲列表理解適度更易讀 – 2012-07-11 16:53:39

+1

我'只要提到你可以通過定義'is_levenstein_less_than_2(x,y)'來提高這個算法的速度。你需要這樣做,因爲你可以通過沿着主對角線執行DP來實現'O(min(| x |,| y |))'。 – JPvdMerwe 2012-07-11 17:04:19