这是我的代码:
def similarStrings(str1,str2):
lenth=len(str1)
count=0
i=0
while (count<lenth):
if str1[count]==str2[count]:
i=i+1
else:
i=i
if i>=length-1:
return True
else:
return False
我的期望是它应该返回一些东西......但是当我运行它时,窗口上没有任何东西出现。我正在做两个字符串的比较,如果少于一个字符不同,它应该返回true。当有多个差异字符时,它应该返回false。 有人可以帮我解决我的代码吗?
答案 0 :(得分:3)
您永远不会向count
添加任何内容,因此它基本上就像调用while 0 < 1:
一样。
在while
循环结束时,添加count+=1
。将您的代码更改为:
def similarStrings(str1,str2):
length=len(str1)
count=0
i=0
while (count<length):
if str1[count]==str2[count]:
i=i+1
else:
i=i
count+=1
if i>=length-1:
return True
else:
return False
答案 1 :(得分:1)
正如我在评论中所述,您的算法不起作用,因为您没有在count
循环中增加while
; while (count<lenth)
永远是真的,因此你有一个无限循环。与while True
类似。
你问过如何比较两个字符串,而另一个字符串可能比另一个字符串长。有很多种方法,但一种经典算法是Levenshtein Distance。如果字符串相同,则返回0.任何大于0的数量都是使一个字符串与另一个字符串相同的编辑数。
以下是Levenshtein距离的Rosetta Code版本:
def LevDist(s1,s2):
if len(s1) > len(s2):
s1,s2 = s2,s1
distances = range(len(s1) + 1)
for index2,char2 in enumerate(s2):
newDistances = [index2+1]
for index1,char1 in enumerate(s1):
if char1 == char2:
newDistances.append(distances[index1])
else:
newDistances.append(1 + min((distances[index1],
distances[index1+1],
newDistances[-1])))
distances = newDistances
return distances[-1]
测试它:
>>> LevDist('kitten', 'kitten')
0
>>> LevDist('kittens', 'kitten')
1
>>> LevDist('kitten', 'cat')
5
另一种方法是使用difflib中的工具。
祝你好运。答案 2 :(得分:0)
您的代码中存在一些问题:
1-你必须增加计数。
2-您正在为同一个变量“lenth”/“length”设置不同的名称。
如果str1大于str2(索引超出范围), 3- str1[count]==str2[count]:
将引发错误。
但是,如果你想检查这两个字符串是否相似,你可以使用:
if str1 == str2:
return something
否则请告诉我你想做什么。
答案 3 :(得分:0)
运行程序时没有显示任何内容,因为它在infinite loop中运行。
while (count<lenth):
语句告诉python在count小于&#34; lenth&#34;时继续运行,但由于count的值永远不会改变,所以始终为真,并且python继续无休止地运行。
您在python中实际上需要这样的索引或计数器是很少见的。你可以通过使用for循环删除索引来修复它,如下所示:
def similarStrings(str1, str2):
length = len(str1)
i = 0
for char1, char2 in zip(str1, str2):
if char1 == char2:
i = i+1
if i >= length-1:
return True
else:
return False
我尽管如此重写了这个功能:
def similarStrings(str1, str2, difference=1):
from itertools import izip_longest
return sum(
char1 != char2
for char1, char2 in izip_longest(str1, str2)
) <= difference
我写了一个测试套件,各种各样:
def test(s1, s2):
if similarStrings(s1, s2):
print 'SIMILAR:'
else:
print 'NOT SIMILAR:'
print ' ', s1
print ' ', s2
def main():
test('', '')
test('abc', 'abc')
test('abcd', 'abc')
test('abc', 'abcd')
test('abcd', 'abce')
test('abcd', 'abcee')
test('abcdd', 'abce')
test('abcdd', 'abcee')
if __name__ == '__main__':
exit(main())
使用我的最终实现,这给了我这些结果:
SIMILAR:
SIMILAR:
abc
abc
SIMILAR:
abcd
abc
SIMILAR:
abc
abcd
SIMILAR:
abcd
abce
NOT SIMILAR:
abcd
abcee
NOT SIMILAR:
abcdd
abce
NOT SIMILAR:
abcdd
abcee