2013-10-31 45 views
5

我有一個用戶輸入兩個字符串,然後我想檢查是否有任何相似的字符,如果有,獲取第一次相似性發生的位置,而不使用查找或索引功能。試圖找到兩個字符串匹配 - 蟒蛇

下面是我迄今爲止的,但我沒有完全工作。到目前爲止,我可以找到相似之處,但我不知道如何在不使用索引函數的情況下找到這些相似點的位置。

string_a = "python" 

string_b = "honbe" 

same = [] 

a_len = len(string_a) 
b_len = len(string_b) 

for a in string_a: 
    for b in string_b: 

     if a == b: 
      same.append(b)   

print (same) 

眼下輸出爲:

['h', 'o', 'n'] 

所以基本上我問什麼,我怎麼能找到這些字符的位置,而不使用Python指數函數?

回答

5

這是一個完美的使用情況difflib.SequenceMatcher

import difflib 

string_a = 'python' 
string_b = 'honbe' 

matcher = difflib.SequenceMatcher(a=string_a, b=string_b) 
match = matcher.find_longest_match(0, len(matcher.a), 0, len(matcher.b)) 

match對象將有屬性ab ,和size,其中a是起始索引字符串matcher.a,bmatcher.b的起始索引,並且size是匹配的長度。

例如:

>>> match 
Match(a=3, b=0, size=3) 
>>> matcher.a[match.a:match.a+match.size] 
'hon' 
>>> match.a 
3 
>>> match.b 
0 
+1

嘿有什麼方法可以獲得比賽的數量? – Mohsin

2

你應該遍歷指數:

for i in range(len(string_a)): 
    for j in range(len(string_b)): 
     if string_a[i] == string_b[j]: 
      same.append((i, j, string_b[j])) 

這將創建一個元組看起來像列表:如果你想所有比賽

[ (3, 0, "h"), ... ] 
1
def find_similarity(string_a, string_b): 
    for ia, ca in enumerate(string_a): 
     for ib, cb in enumerate(string_b): 
      if ca == cb: 
       return ia, ib, ca 

,而不是隻首先,您可以用yield陳述替換return陳述,然後迭代結果或簡單地:

matches = list(find_similarity(string_a, string_b))

在後一種情況下,你會得到:

list(find_similarity(string_a, string_b)) 
=> [(3, 0, 'h'), (4, 1, 'o'), (5, 2, 'n')] 
3

可以使用列表解析和itertools的組合解決了這個問題。

import itertools 
string_a = 'hello_world' 
string_b = 'hi_low_old' 

same = [ i for i,x in enumerate(itertools.izip(string_a,string_b)) if all(y==x[0] for y in x)] 

In [38]: same 
Out[38]: [0, 3, 4, 7] 

這裏我們通過元素比較兩個字符串元素並返回所有發現相似的索引。輸出可以很容易地改變,以包括匹配的字符等。這種方法可以輕鬆擴展以比較多個單詞。

+0

簡單而輝煌。 – peixe