2013-08-16 170 views
1

下面是問題:比較python中的兩個字符串?

給定兩個單詞中每個字母的數目相同,計算出需要更改多少個字母才能從第一個單詞到第二個單詞。編輯距離的更復雜版本通常用於在手機和文字處理器上拼寫自動糾正算法以查找候選糾正。

這兩個單詞應該從用戶那裏讀取,每行一個單詞。例如:

Word 1: hello 
Word 2: jelly 
2 

這就是我的一切:

w1 = input('Word 1: ') 
w2 = input('Word 2: ') 
for i in w1: 
    for o in w2: 
    print(i, o) 

我該怎麼辦呢?

回答

5

你可以嘗試這樣的:

sum(c1 != c2 for c1,c2 in zip(w1,w2)) 

zip(w1,w2)創建一個發電機,它返回的元組由w1w2相應的字母。即:

>>> list(zip(w1,w2)) 
[('h', 'j'), ('e', 'e'), ('l', 'l'), ('l', 'l'), ('o', 'y')] 

我們遍歷這些元組(c1被分配給每個第一char和c2每第二個字符),並檢查是否c1 != c2。我們將滿足這個條件的所有實例加起來得出答案。

(參見zip()sum()


>>> w1 = 'hello' 
>>> w2 = 'jelly' 
>>> 
>>> sum(c1 != c2 for c1,c2 in zip(w1,w2)) 
2 
+0

謝謝!有效!你能解釋一下代碼中發生了什麼嗎? – Samir

+0

@Samir當然,我添加了一些解釋。 – arshajii

3

使用difflib

>>> import difflib 
>>> w1, w2 = 'hello', 'jelly' 
>>> matcher = difflib.SequenceMatcher(None, w1, w2) 
>>> m = sum(size for start, end, size in matcher.get_matching_blocks()) 
>>> n = max(map(len, (w1, w2))) # n = len(w1) 
>>> n - m 
2 
+1

'difflib'通常是解決這些類型問題的好地方。但對於這樣簡單的事情來說,這似乎是過度殺傷力。 – arshajii

2

一種功能性的方法:

>>> from itertools import starmap 
>>> from operator import ne 
>>> sum(starmap(ne, zip(word1, word2))) 
2 
+2

沒有導入,也沒有使用'zip'方法::'sum(map(str .__ ne__,a,b))' –

+0

@JonClements:好的!請注意,有一個細微的差別,因爲'zip()'在最短的單詞後停止,而map()繼續運行,直到最長的單詞耗盡,使用'None'作爲填充值,以防單詞長度不同。 –

+0

確實如此,但我會認爲'str .__ ne__'這個更理想的行爲將以'TypeError'結尾,這也是一個斷言,長度與問題文本中所述的長度相同。 –

1

如果字s的總是要相同的長度,你可以一次使用zip遍歷兩個列表:

w1 = input('Word 1: ') 
w2 = input('Word 2: ') 
changes=0  
    for i, o in zip(w1, w2): 
    if i != o: 
     changes+=1 

print "Changes needed: "+str(changes)