python中查找第一个字符串的函数可以通过插入或删除单个字符而与第二个字符串相同

python中查找第一个字符串的函数可以通过插入或删除单个字符而与第二个字符串相同,python,Python,我需要用python编写一个函数,它接受两个字符串作为输入参数并返回: 如果两个字符串完全匹配,则为0 1如果通过插入或删除单个字符(不替换它们),第一个字符串可以与第二个字符串相同 2否则 我确实成功地为0和2执行了此操作,但在1上遇到了问题。 有什么想法吗 def single_insert_or_delete(s1,s2): s1lower=s1.lower() s2lower=s2.lower() str_1=list(s1lower) str_2=l

我需要用python编写一个函数,它接受两个字符串作为输入参数并返回:

  • 如果两个字符串完全匹配,则为0
  • 1如果通过插入或删除单个字符(不替换它们),第一个字符串可以与第二个字符串相同
  • 2否则
我确实成功地为0和2执行了此操作,但在1上遇到了问题。 有什么想法吗

def single_insert_or_delete(s1,s2):
    s1lower=s1.lower()
    s2lower=s2.lower()
    str_1=list(s1lower)
    str_2=list(s2lower)
    string_1=set(str_1)
    string_2=set(str_2)
    mismatch=list(string_1.symmetric_difference(string_2))
    exact="0"
    one_change="1"
    otherwise="2"
    if s1lower==s2lower:
        return int(exact)
    elif len(mismatch)<2:
        ????????
        return int(one_change)
    else:
        return int(otherwise)

s1=input("write a word: ")
s2=input("write a word: ")
print(single_insert_or_delete(s1,s2))
def单次插入或删除(s1、s2):
s1lower=s1.lower()
s2lower=s2.lower()
str_1=列表(s1更低)
str_2=列表(S22更低)
string_1=set(str_1)
string_2=set(str_2)
不匹配=列表(字符串\u 1.对称\u差(字符串\u 2))
精确=“0”
一个更改=“1”
否则=“2”
如果s1lower==s2lower:
返回整数(精确)
elif len(不匹配)
这也会缩短代码并提供更多选项。
SequenceMatcher
所做的是基于算法的相似性匹配,该算法是一种贪婪算法,试图首先匹配最长的匹配,这对您应该是有益的

它将返回一个
float
,其中
1.0
100%
匹配,
0.0
0%


微调所需的
ratio()
值以匹配
return 1
将是至关重要的,例如,将值threshold设置为高将导致
return 2
开始执行,而实际上
sink==sin
应该
return 1
以上注释是正确的-放在一起(您可以执行案例强制)


def单次插入或删除(s1、s2):


您需要实施一些优化的编辑距离算法,以便在编辑距离超过1时立即中断。Google Levenshtein distance并相应地修改它。
从difflib导入SequenceMatcher
这会有帮助吗?例如
SequenceMatcher(无,a,b)。ratio()
如果匹配得非常紧密,可能会返回0.9。而0.1可能会有问题,让我们保持简单。并行迭代两个字符串,一旦出现差异,就检查是否可以通过删除其中一个不同的字符使这两个字符串相等?这是什么意思“我确实为0和2做了,但在1方面遇到了问题。有什么想法吗?"因为此代码适用于0和1is
guf==gfu==ufg等等,所以在您的case@TamaraButala这是因为比较的比率将是
0.85
,这意味着您需要微调比较方法。这适用于您需要进行的任何比较。有不同的比较方法,它们适用于不同的事情。这是一个解决方案,它不是完美的图片,但给了你一个想法和一些可以使用的东西。@TamaraButala我更新了我的问题,以匹配80%以上的任何内容,并添加了一个关于函数实际作用的小说明。@TamaraButala我很高兴。祝你的项目好运!:)
from difflib import SequenceMatcher
def matcher(s1, s2):
    if s1 == s2:
        return 0
    elif SequenceMatcher(None, s1, s2).ratio() > 0.8: # 80% similarity-match
        return 1
    return 2
import leven  

def single_insert_or_delete(s1,s2):
    if s1==s2:
        return 0
    elif leven.levenshtein(s1,s2)==1:
        return 1
    else:
        return 2
if s1 == s2:
    return 0
elif len(s1) == len(s2):
    return 2

elif  len(s1) - len(s2) == 1:
    if s1[1:] == s2 or s1[:-1] == s2:
        return 1
elif len(s1) - len(s2) == -1:
    for i in range(len(s2)):
        if s1 == s2[:i] + s2[i+1:]:
            return 1
else:
    return 2