def valid(s, alphabet):
""" (str, str) -> bool
Return True iff s is composed only of characters in alphabet.
>>> valid('adc', 'abcd')
True
>>> valid('ABC', 'abcd')
False
>>> valid('abc', 'abz')
False
"""
for ch in s:
if ch in alphabet:
return True
else:
return False
我做了一些错误检查,我发现在ch
中只检查它,直到它看到返回True值。
我的代码适用于前两个,但是第三个代码只检查a
,然后返回True并且不检查其他值。
如何让for循环遍历每个字母并用另一个字符串检查?
答案 0 :(得分:1)
如果存在任何不匹配字符并且从for循环返回True,则只需要通过返回False来调整逻辑。
for ch in s:
if ch not in alphabet:
return False # 1
return True # 2
关键是如果python执行#1
它退出循环,所以它永远不会遇到#2
,直到alphabet
中存在所有字符。
除此之外,你还有其他选择可能更加pythonic。 On正在使用set()
对象及其正确的方法。另一个是使用内置函数,如all
和any
。
但请注意,有时将字符串转换为set
的成本可能高于复杂性成本。因此,您应该根据自己的需要选择最佳方式。您可以使用timeit
模块来测量执行时间。
以下是使用set()
的其中一个答案和使用all()
的基于生成器的方法的时间表:
In [1]: a = 'abc'
In [2]: b = 'abcd'
In [8]: def regular(s, alphabet):
for ch in s:
if ch not in alphabet:
return False # 1
return True
...:
In [9]: def valid(s, alphabet):
return set(s) < set(alphabet)
...:
In [10]: def generator(s, alphabet):
return all(ch in alphabet for ch in s)
In [11]: %timeit regular(a, b)
1000000 loops, best of 3: 262 ns per loop
In [12]: %timeit valid(a, b)
1000000 loops, best of 3: 635 ns per loop
In [13]: %timeit generator(a, b)
1000000 loops, best of 3: 639 ns per loop
答案 1 :(得分:0)
使用set
差异并检查将字母表中的所有字母减去该单词是否为空集:
def valid(s, alphabet):
return not set(s) - set(alphabet)
使用all
和set
的另一种方法可以获得更好的查找效果:
def valid(s, alphabet):
sa = set(alphabet)
return all(x in sa for x in s) # True if condition True for all chars
答案 2 :(得分:0)
将参数转换为set
个对象,并检查一个集合是否是其他集合的正确子集:
def valid(s, alphabet):
return set(s) < set(alphabet)
print(valid('ABC', 'abcd')) # False
print(valid('abc', 'abcd')) # True
设置&lt;其他强>
测试集合是否是其他集合的正确子集,即设置&lt; = other并设置!= other。
答案 3 :(得分:0)
第一次找到字母表中的字符时,您的方法返回True。这意味着该方法以布尔值True作为其输出结束。因此,您的for循环不会继续,也不会检查剩余的字符。
要解决此问题,您可以将代码更改为:
for ch in s:
if ch not in alphabet:
return False
return true
通过这种方式,当找到不在字母表中的字符(返回False)或者已经检查了所有字符并且它们都在字母表中(返回True)时,方法结束。