Python if语句只执行一次

时间:2016-03-27 00:28:15

标签: python string if-statement

我尝试通过给定两个字符串来制作一个简单的拼写检查程序,并使第一个调整到第二个字符串。如果字符串具有相同的长度,我的代码工作正常但如果它们不同,那么问题就开始了。它只执行一次if语句,然后停止。如果我删除了断点,我会得到一个IndexError:list index超出范围。

这是我的代码:

#!python
# -*- coding: utf-8 -*-

def edit_operations(first,second):

    a = list(first)
    b = list(second)
    counter = 0
    l_a = len(a)
    l_b = len(b)

    while True:
            if a == b:
                    break

            if l_a > l_b:
                    if a[counter] != b[counter]:
                            a[counter] = ""
                            c = "".join(a)
                            print "delete", counter+1, b[counter], c
                            counter += 1
                            l_a -= 1
                            break

            if l_a < l_b:
                    if a[counter] != b[counter]:
                            c = "".join(a)
                            c = c[:counter] + b[counter] + c[counter:]
                            print "insert", counter+1, b[counter], c
                            counter += 1
                            l_a += 1
                            break      

            if a[counter] != b[counter]:                       
                    a[counter] = b[counter]
                    c = "".join(a)
                    print "replace", counter+1, b[counter], c
                    counter += 1

            else:
                    counter += 1

if __name__ == "__main__":

    edit_operations("Reperatur","Reparatur")
    edit_operations("Singel","Single")
    edit_operations("Krach","Stall")
    edit_operations("wiederspiegeln","widerspiegeln")
    edit_operations("wiederspiglen","widerspiegeln")
    edit_operations("Babies","Babys")
    edit_operations("Babs","Babys")
    edit_operations("Babeeees","Babys")

这是我得到的输出:

replace 4 a Reparatur
replace 5 l Singll
replace 6 e Single
replace 1 S Srach
replace 2 t Stach
replace 4 l Stalh
replace 5 l Stall
delete 3 d widerspiegeln
replace 3 d widderspiglen
replace 4 e wideerspiglen
replace 5 r widerrspiglen
replace 6 s widersspiglen
replace 7 p widersppiglen
replace 8 i widerspiiglen
replace 9 e widerspieglen
replace 11 e widerspiegeen
replace 12 l widerspiegeln
delete 4 y Babes
insert 4 y Babys
delete 4 y Babeees

通过最后3行你可以看到我的问题,我现在有点绝望了。 希望有人可以给我一个暗示它有什么问题

3 个答案:

答案 0 :(得分:0)

标题中问题的答案 - 即if语句只执行一次 - 已经在对你的问题发表评论,也就是说,{{1}中有两个break s阻止ifif l_a < l_b:。 通常,if l_a < l_b:语句会中断它找到的最接近的循环,无论break找到自己的块的嵌套方式如何。

但是,您的代码中会出现其他问题:

  • 列表break的大小保持不变,但是相同的a用于迭代两个字符串的字母。如果两个字符串的长度不同,则此问题最终导致错误counter,因为允许退出循环的唯一条件是两个字符串相同时。此外,当IndexError: list index out of range时,与l_a > l_b不匹配的b的相同字符应使用已删除字符旁边的字符进行检查,但是这不会因为相同{{1}而发生}}

  • a未修改列表counter;只需使用附加字母创建一个新列表l_a < l_b。请查看list documentation

  • a未正确更新,因为当两个字符串的长度不同时,只有字母不同时才会递增。这会导致无限循环。

通常,考虑使用调试器来解决问题(查看python https://wiki.python.org/moin/PythonDebuggingTools中可用的调试器)。可以在线或在书店中找到许多资源来学习如何调试代码。

答案 1 :(得分:0)

您应该使用list.insert()函数在列表中插入一个字符,del运算符从列表中删除单个字符,并将a == b比较移动到{ {1}}循环条件。变量while应指示要比较的下一个字符的索引,如果字符不相等,则不应递增。像这样:

counter

我稍微更改了一下打印语句。

答案 2 :(得分:-5)

我真的不明白你的问题是什么,但如果你需要拼写检查,请使用library