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(' ', '')
あなたも関数内でこの部分を含めることができます。
@Antimonyおかげで 'A =「アップルバナナOrange''&' B =」オレンジバナナアップル」を設定しようとしました'、結果は' 13'ですか? – thewaywewere
私はあなたが言及したものを含め、より一般的なケースを扱うために私の答えを更新しました。それを指摘してくれてありがとう! – Antimony
移動した場合 サイズ= [iをcのiとする] i = sizes.index(max(sizes)) whileループがうまく動作します –