2013-10-31 5 views
5

私は2つの文字列を入力した後、類似した文字があるかどうかをチェックしたい場合は、findを使わずにまたは索引機能。2つの文字列の一致を見つけようとしています - Python

以下は私が今までに持っていたものですが、完全には機能しません。私がこれまでに持っているものでは、類似点を見つけることができますが、インデックス関数を使わずに類似点の位置を見つける方法がわかりません。

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.abmatcher.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

あなたはインデックスを反復処理する必要があります。ちょうどあなたがすべて試合をしたい場合は

[ (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 

、代わりに:

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])) 

これは、ように見えるタプルのリストを作成します。最初にreturnステートメントをyieldステートメントに置き換えて、結果を繰り返したり、単純に:後者の場合

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] 

ここでは、2つの文字列を要素ごとに比較し、類似していると見出されたすべてのインデックスを返します。一致した文字を含むように出力を簡単に変更することができます。このメソッドは、複数の単語を比較するために簡単に拡大縮小されます。

+0

シンプルで鮮やかです。 – peixe