首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个名为spelling_corrector的函数。

编写一个名为spelling_corrector的函数。
EN

Stack Overflow用户
提问于 2016-02-27 17:25:11
回答 1查看 1.2K关注 0票数 1

函数应该根据correct_spells列表中的所有单词检查输入字符串中的每个单词,并返回一个字符串,以便:

  • 如果原始句子中的单词与correct_spells中的单词完全匹配,则该单词不会被修改,应该直接复制到输出字符串。
  • 如果句子中的一个单词可以通过替换、插入或删除单个字符来匹配correct_spells列表中的一个单词,那么这个单词应该被correct_spelled列表中的正确单词替换。
  • 如果上述两个条件都不为真,则不应修改原始字符串中的单词,而应将其直接复制到输出字符串中。

备注:

  • 不要拼写,检查一个或两个字母单词(直接复制到输出字符串)。
  • 如果是领带,请使用correct_spelled列表中的第一个单词。
  • 忽略大写,即认为大写字母与小写字母相同。
  • 输出字符串中的所有字符都应该是小写字母。
  • 假设输入字符串只包含字母字符和空格。(a-z和A-Z)
  • 删除单词之间的额外空格。
  • 删除输出字符串开头和结尾处的空格。

示例:

在这里输入图像描述

注意:

  • 在第一个例子中,“the”没有被任何东西所取代。
  • 在第一个例子中,“case”和“car”都可以替换原来句子中的“cas”,但是选择“case”是因为它是第一个遇到的。

这是我尝试过的代码,但并不是很有用:

代码语言:javascript
复制
def spelling_corrector(input_string,input_list):
new_string = input_string.lower().split()
count = 0
for x in new_string:
    for y in input_list:
        for i in y:
            if i not in x:
                count += 1
    if count == 1:
        print(y)
    if len(x) == len(y) or x not in input_list:
        print(x)

spelling_corrector("Thes is the Firs cas", ['that','first','case','car'])`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-27 18:34:19

代码语言:javascript
复制
def replace_1(bad:str, good:str) -> bool:
    """Return True if bad can be converted to good by replacing 1 letter.
    """
    if len(bad) != len(good):
        return False

    changes = 0
    for i,ch in enumerate(bad):
        if ch != good[i]:
            return bad[i+1:] == good[i+1:]

    return False

def insert_1(bad:str, good:str) -> bool:
    """Return True if bad can be converted to good by inserting 1 letter.
    """
    if len(bad) != len(good) - 1:
        return False

    for i,ch in enumerate(bad):
        if ch != good[i]:
            return bad[i:] == good[i+1:]

    # At this point, all of bad matches first part of good. So it's an
    # append of the last character.
    return True

def delete_1(bad:str, good:str) -> bool:
    """Return True if bad can be converted to good by deleting 1 letter.
    """
    if len(bad) != len(good) + 1:
        return False
    return insert_1(good, bad)


def correction(word:str, correct_spells:list) -> str:
    if len(word) < 3:
        return word
    if word in correct_spells:
        return word
    for good in correct_spells:
        if replace_1(word, good):
            return good
        if insert_1(word, good):
            return good
        if delete_1(word, good):
            return good

    return word

def spelling_corrector(sentence:str, correct_spells:list) -> str:
    words = sentence.strip().lower().split()
    correct_lower = [cs.lower() for cs in correct_spells]
    result = [correction(w, correct_lower) for w in words]
    return ' '.join(result)

tests = (
    ('Thes is the Firs cas', "that first case car", 'thes is the first case'),
    ('programming is fan and easy', "programming this fun easy hook", 'programming is fun and easy'),
    ('Thes is vary essy', "this is very very easy", 'this is very easy'),
    ('Wee lpve Python', "we Live In Python", 'we live python'),
)

if __name__ == "__main__":
    for t in tests:
        correct = t[1].split()
        print(t[0], "|", t[1], "|", t[2])
        print("Result:", spelling_corrector(t[0], correct))
        assert spelling_corrector(t[0], correct) == t[2]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35672938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档