我正在写一个for循环比较list和string中的字符,如果字符不相同则返回False。但我一直接受真实。有人可以解释我的代码有什么问题吗?
def compare (sofar, orig):
if len(sofar) == len(orig):
for i in range(len(orig)+1):
if orig[i] == sofar[i]:
return True
else:
return False
return False

这是我得到的结果:
In [29]: compare (['a','v','c','c','s'], 'abccs')
Out[29]: True
但它假设是假的
答案 0 :(得分:0)
您可以将字符重新加入字符串
def compare (sofar, orig):
return ''.join(sofar) == orig
否则,如果您想要循环,则需要在返回True之前比较所有字符。当第一个不匹配
时,您可以返回False这是另一个在压缩字符循环上使用all()
的衬垫。
您需要在本声明之前进行长度检查
return all(x == y for x, y in zip(sofar, orig))
或者回到原始代码,反转你的逻辑
def compare (sofar, orig):
if len(sofar) != len(orig):
return False
for i in range(len(orig)):
if orig[i] != sofar[i]:
return False
return True
答案 1 :(得分:0)
如果您的功能达到了return
声明,那就是它。您的函数已返回一个值,它将无法继续运行。
您可以使用generator来实现您的逻辑。以下解决方案允许您懒洋洋地迭代;通过list
检索带有字母对照的布尔列表;或检查所有字母是否通过all
对齐。
def compare(sofar, orig):
if len(sofar) == len(orig):
for i in range(len(orig)):
if orig[i] == sofar[i]:
yield True
else:
yield False
res = list(compare(['a','v','c','c','s'], 'abccs'))
# [True, False, True, True, True]
res = all(compare(['a','v','c','c','s'], 'abccs'))
# False
在没有显式迭代的情况下编写逻辑的另一种方法:
lst = ['a','v','c','c','s']
mystr = 'abccs'
res = ''.join(lst) == mystr
答案 2 :(得分:0)
语句返回是从您的函数退出。 所以你的编程只比较第一个元素。
if orig[i] != sofar[i]:
return False
会这样做