0

我正在尝试做的事情:通过扫描每个字符串来确定两个字符串是否匹配(不使用比较运算符或 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

4 回答 4

4

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

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

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

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

于 2013-06-10T12:50:53.357 回答
1

您必须小心,这是您当前的方式(改写并且不会对不同长度的字符串造成异常......但它也不会得到正确的答案):

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

值得注意的是anywill 短路(就像你的实现中的 break 一样)。如果您对子字符串(例如“aa”、“a”)进行测试,它仍然不可靠,您会得到误报......

您可以改为使用 outerzip(这意味着您正在将任何后面的字符串与 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
于 2013-06-10T13:09:06.760 回答
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

在您的代码中,您将在每次迭代中重置countto的值: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")
于 2013-06-10T12:51:25.913 回答
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,将 count 移出 while 循环并更改 while True ==> while count != len(a) 以防止“IndexError:字符串索引超出范围”。

于 2013-06-10T12:57:26.500 回答