Python-比较两个字符串 - 无法循环

时间:2013-06-10 12:47:24

标签: python loops python-3.x while-loop string-matching

我试图做的事情:通过扫描每个字符串来确定两个字符串是否匹配(不使用比较运算符或cmp()内置函数)。

我的解决方案:

a = input('Please enter the first string to compare:')
b = input('Please enter the second string to compare: ')

while True:
    count = 0
    if a[count] != b[count]:             # code was intended to raise an alarm only after finding the first pair of different elements
        print ('Strings don\'t match! ')
        break
    else:                                # otherwise the loop goes on to scan the next pair of elements
        count = count + 1

问题: 经过测试,该脚本似乎只能比较每个字符串中的第一个元素([0])。如果两个字符串中的第一个元素相同(a[0] == b[0]),那么它将不会继续扫描其余的字符串。并且它在解释器中没有返回任何内容。如果else套件被执行,脚本也不会自行结束。

所以,如果有人可以对我的循环机制出了什么问题,或者只是对这个脚本的一般批评,我会很感激。非常感谢你!

4 个答案:

答案 0 :(得分:4)

您正在循环的每次迭代中将count重置为0。因此,循环一遍又一遍地重复比较第一元素。要解决该问题,只需将count = 0赋值移到循环之外,如下所示:

# ...
b = input('Please enter the second string to compare: ')

count = 0
while True:
    if a[count] != b[count]:
# ...

当你这样做时,你会发现你有第二个问题 - 程序在你到达其中一个字符串的末尾时崩溃了。您可能也想处理这种情况。

答案 1 :(得分:1)

您可以在此处使用zip

def compare(s1, s2):
   if len(s1) != len(s2):
       return False
   else:
      for c1, c2 in zip(s1, s2):
         if c1 != c2:
             return False
         else:    
             return True

>>> compare('foo', 'foo')
True
>>> compare('foo', 'fof')
False
>>> compare('foo', 'fooo')
False

在您的代码中,您在每次迭代中将count的值重置为0

a = input('Please enter the first string to compare:')
b = input('Please enter the second string to compare: ')
if len(a) !=  len(b):            # match the length first
    print ('Strings don\'t match')
else:
    count = 0                    #declare it outside of while loop
    while count < len(a):        #loop until count < length of strings
        if a[count] != b[count]:
            print ('Strings don\'t match! ')
            break
        count = count + 1
    else:
       print ("string match")

答案 2 :(得分:1)

a = raw_input('Please enter the first string to compare:')
b = raw_input('Please enter the second string to compare: ')

count = 0 
if len(a) == len(b):
    while count < len(a):
        if a[count] != b[count]:             # code was intended to raise an alarm only after finding the first pair of different elements
            print ('Strings don\'t match! ')
            break
        else:                                # otherwise the loop goes on to scan the next pair of elements
            count = count + 1 
else:
    print "Strings are not of equal length"

使用raw_input,将计数从while循环中移出并在True ==&gt;时更改while count!= len(a)以防止“IndexError:字符串索引超出范围”。

答案 3 :(得分:1)

你必须要小心,这是你当前的方式(改写,不会导致不同长度的字符串异常...但它也不会得到正确的答案):

not any(c1 != c2 for c1, c2 in zip(s1, s2))

值得注意的是any会短路(就像你实施中的休息一样)。如果你测试子串,它仍然不健壮,例如'aa','a'你会得到误报......

您可以使用外部缩写(这意味着您将以后的任何字符串与fillvalue进行比较):

from itertools import izip_longest
not any(c1 != c2 for c1, c2 in izip_longest(s1, s2, fillvalue=''))

行动中:

def compare(s1, s2):
    return not any(c1 != c2 for c1, c2 in izip_longest(s1, s2, fillvalue=''))

s1 = 'ab'
s2 = 'a'
compare(s1, s1) # True
compare(s1, s2) # False