我试图做的事情:通过扫描每个字符串来确定两个字符串是否匹配(不使用比较运算符或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
套件被执行,脚本也不会自行结束。
所以,如果有人可以对我的循环机制出了什么问题,或者只是对这个脚本的一般批评,我会很感激。非常感谢你!
答案 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