【问题标题】:Write a function named spelling_corrector. [closed]编写一个名为 spelling_corrector 的函数。 [关闭]
【发布时间】:2016-02-27 17:25:11
【问题描述】:

函数应该检查输入字符串中的每个单词与正确拼写列表中的所有单词并返回一个字符串:

  • 如果原句中的一个词与句子中的一个词完全匹配 正确的拼写然后这个词没有被修改,它应该是 直接复制到输出字符串中。

  • 如果句子中的单词可以匹配正确拼写列表中的单词 通过替换、插入或删除单个字符,然后 单词应该替换为正确拼写中的正确单词 列表。

  • 如果前两个条件都不为真,则 原字符串不应该被修改,应该直接 复制到输出字符串。

注意事项:

  • 不要对一个或两个字母单词进行拼写检查(将它们直接复制到 输出字符串)。

  • 如果出现平局,请使用正确拼写列表中的第一个单词。

  • 忽略大小写,即认为大写字母相同 小写字母。

  • 输出字符串中的所有字符都应为小写 字母。

  • 假设输入字符串只包含字母字符和 空格。 (a-z 和 A-Z)

  • 删除单词之间的多余空格。

  • 删除输出字符串开头和结尾的空格。

例子:

enter image description here

注意:

  • 在第一个示例中,'thes' 没有替换为任何内容。

  • 在第一个示例中,'case' 和 'car' 都可以替换原句中的 'cas',但选择了 'case',因为它首先遇到。

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

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

【问题讨论】:

标签: python regex string


【解决方案1】:
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]

【讨论】: