我尝试通过给定两个字符串来制作一个简单的拼写检查程序,并使第一个调整到第二个字符串。如果字符串具有相同的长度,我的代码工作正常但如果它们不同,那么问题就开始了。它只执行一次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行你可以看到我的问题,我现在有点绝望了。 希望有人可以给我一个暗示它有什么问题
答案 0 :(得分:0)
标题中问题的答案 - 即if语句只执行一次 - 已经在对你的问题发表评论,也就是说,{{1}中有两个break
s阻止if
和if 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