Python中不匹配的字符串 - 如何继续处理?

时间:2016-02-24 17:15:12

标签: python string

我是编程的初学者,我正在努力弄清楚Python的一些功课,感觉我很紧张!我在这个论坛上查了很多问题而无法找到相关的答案,所以这里就是..

问题: 编写一个名为find_mismatch的函数,它接受两个字符串作为输入参数并返回:

如果两个字符串完全匹配,则

如果两个字符串只有一个字符长度和不匹配,则

1。

如果两个字符串的长度不同或两个或多个字符不匹配,则

2。

大写字母与小写字母相同。

我的主要问题是我的程序似乎只在一次不匹配后结束。什么是确保它贯穿整个代码的好方法?我认为它也可能比它需要的更麻烦......

def find_mismatch(s1,s2):
    s1=s1.lower()
    s2=s2.lower()
    x=s1.split()
    y=s2.split()
    mismatch=0
    count=0
    for char in (0,len(x+1)):
        if len(x)==len(y) and x[0:]==y[0:]:
            return 0
        if not len(s1)==len(s2):
            return 2
    #if len(x)==len(y) and not x[0:]==y[0:]:#problem is here?
        if len(s1)==len(s2) and not x[count]==y[count]:
            mismatch=mismatch+1
                #count=count+1#problem here
            if mismatch<2:
                return 1
            if mismatch>=2:
                return 2

我倾向于过于复杂化这些问题 - 非常感谢任何帮助!如果我添加评论中提到的计数器,我会收到索引错误。

3 个答案:

答案 0 :(得分:1)

请在下面找到我的答案,我希望它会对你有帮助。

def find_mismatch(s1,s2):
    count = 0
    if len(s1) == len(s2):
        for i in range(len(s1)):
            if s1[i].lower() != s2[i].lower():
                count += 1
        if count == 0:
            return 0
        elif count == 1:
            return 1
        else:
            return 2
    else:
        return 2

答案 1 :(得分:0)

  

什么是确保它贯穿整个代码的好方法?

不要在循环中执行return语句,除非您想提前退出循环。我没有测试你剩下的功能,但你可以这样做:

def find_mismatch(s1,s2):
    s1=s1.lower()
    s2=s2.lower()
    x=s1.split()
    y=s2.split()
    mismatch=0
    count=0
    for char in range(0,len(x+1)):
        if len(x)==len(y) and x[0:]==y[0:]:
            return 0
        if not len(s1)==len(s2):
            return 2
        #if len(x)==len(y) and not x[0:]==y[0:]:  
        if len(s1)==len(s2) and not x[count]==y[count]:
            mismatch +=1
            #count +=1

    return mismatch if mismatch <=2 else 2

您的代码可以进一步简化,例如因为字符串是可迭代的我怀疑您需要将其转换为x = s1.split()等列表。

def mismatch(s1, s2):
    s1, s2 = s1.lower(), s2.lower()
    if len(s1) != len(s2): 
        return 2
    elif s1 == s2: 
        return 0
    else:        
        # same length, zip the iterable strings and check for mismatch:
        mismatch = [itm for itm in zip(s1,s2) if itm[0]!=itm[1]]
        # print mismatch
        return 1 if len(mismatch)==1 else 2

答案 2 :(得分:0)

以下程序可以满足您的需求。第一个find_mismatch函数被第一个遮蔽,不需要,并且不运行。它只是具有更明确的参数和变量名称的函数的一个版本。我推荐这两个函数中的第二个,因为它更易于阅读并提供有关它的功能的文档。无论您使用它还是随意调整代码!

#! /usr/bin/env python3


def main():
    print(find_mismatch('Hello, world!', 'Hello, world'))
    print(find_mismatch('Hello, world!', 'Hello, world!'))
    print(find_mismatch('Hello, world!', 'Hallu, world!'))
    print(find_mismatch('Hello, world!', 'Hello, world.'))


def find_mismatch(string_a, string_b):
    if len(string_a) != len(string_b):
        return 2
    folded_a, folded_b = string_a.casefold(), string_b.casefold()
    if folded_a == folded_b:
        return 0
    found_difference = False
    for character_a, character_b in zip(folded_a, folded_b):
        if character_a != character_b:
            if found_difference:
                return 2
            found_difference = True
    return 1


def find_mismatch(a, b):
    """Find mismatches in strings a and b.

    Returns 0 when strings are the same.
    Returns 1 when strings differ in one character.
    Returns 2 any other time (different lengths or more mismatches)."""
    if len(a) != len(b):
        return 2
    a, b = a.casefold(), b.casefold()
    if a == b:
        return 0
    error = False
    for a, b in zip(a, b):
        if a != b:
            if error:
                return 2
            error = True
    return 1


if __name__ == '__main__':
    main()