为什么我的python代码无法获得返回值?

时间:2014-04-15 23:18:17

标签: python string

这是我的代码:

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。 有人可以帮我解决我的代码吗?

4 个答案:

答案 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