2017-10-04 11 views
0

2つの文字列ですべての類似した文字列の合計を返すようにしたい。私は、次のコードを書きましたが、それだけでそれらの1Pythonは同じ文字列を文字列内に見つける

from difflib import SequenceMatcher 
a='Apple Banana' 
b='Banana Apple' 
def similar(a,b): 
    c = SequenceMatcher(None,a.lower(),b.lower()).get_matching_blocks() 
    return sum([c[i].size if c[i].size>1 else 0 for i in range(0,len(c)) ]) 
print similar(a,b) 

返し、出力は、私はそれがあることを期待

6 

次のようになります。11

答えて

0

get_matching_blocks()ためのB [12]マッチの一致は、最長連続マッチングシーケンスを返します。ここでは最長のマッチ列が「バナナ」はしたがって、6

が、この代わりに試してみてください戻っている長さが6で、両方の文字列である:

def similar(a,b): 
    c = 'something' # Initialize this to anything to make the while loop condition pass for the first time 
    sum = 0 

    while(len(c) != 1): 
     c = SequenceMatcher(lambda x: x == ' ',a.lower(),b.lower()).get_matching_blocks() 

     sizes = [i.size for i in c] 
     i = sizes.index(max(sizes)) 
     sum += max(sizes) 

     a = a[0:c[i].a] + a[c[i].a + c[i].size:] 
     b = b[0:c[i].b] + b[c[i].b + c[i].size:] 

    return sum 

これは、文字列の一致する部分を「減算」、 len(c)が1になるまで再び一致します。これは、一致するものがなくなると発生します。

ただし、このスクリプトではスペースは無視されません。そのために、私はthis other SO answerからの提案を使用する:あなたはそうのような関数に渡す前に、文字列だけを前処理する:

a = 'Apple Banana'.replace(' ', '') 
b = 'Banana Apple'.replace(' ', '') 

あなたも関数内でこの部分を含めることができます。

+0

@Antimonyおかげで 'A =「アップルバナナOrange''&' B =」オレンジバナナアップル」を設定しようとしました'、結果は' 13'ですか? – thewaywewere

+0

私はあなたが言及したものを含め、より一般的なケースを扱うために私の答えを更新しました。それを指摘してくれてありがとう! – Antimony

+0

移動した場合 サイズ= [iをcのiとする] i = sizes.index(max(sizes)) whileループがうまく動作します –

0

我々はこのことにあなたのコードを編集するとき

from difflib import SequenceMatcher 
a='Apple Banana' 
b='Banana Apple' 
def similar(a,b): 
    c = SequenceMatcher(None,a.lower(),b.lower()).get_matching_blocks() 
    for block in c: 
     print "a[%d] and b[%d] match for %d elements" % block 
print similar(a,b) 

:どこから来ている6私たちに教えてくれます[6]、B [0]の6つの要素

[12]と0の要素

0

私はあなたのコードに小さな変更を加え、それが魅力のように働いている、

def similar(a,b): 
    a=a.replace(' ', '') 
    b=b.replace(' ', '') 

    c = 'something' # Initialize this to anything to make the while loop condition pass for the first time 
    sum = 0 
    i = 2 
    while(len(c) != 1): 
     c = SequenceMatcher(lambda x: x == ' ',a.lower(),b.lower()).get_matching_blocks() 
     sizes = [i.size for i in c] 
     i = sizes.index(max(sizes)) 
     sum += max(sizes) 
     a = a[0:c[i].a] + a[c[i].a + c[i].size:] 
     b = b[0:c[i].b] + b[c[i].b + c[i].size:] 
    return sum 
関連する問題