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
中仅检查它才能看到返回的真实值。
我的代码适用于前两个,但在第三个方面仅检查a
,然后返回true并且不检查其他值。
如何使for循环通过每个字母并使用另一个字符串检查?
如果有任何不匹配字符,您只需要通过返回false来调整逻辑,然后返回true for for for for for loop。
for ch in s:
if ch not in alphabet:
return False # 1
return True # 2
关键是,如果Python执行#1
,它将退出循环,因此它永远不会符合#2
,直到所有字符都存在于alphabet
中。
除此之外,您还有其他选择可能会更重要的选择。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
使用 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
将参数转换为 set
对象,并检查一个集合是另一个的正确子集:
def valid(s, alphabet):
return set(s) < set(alphabet)
print(valid('ABC', 'abcd')) # False
print(valid('abc', 'abcd')) # True
set&lt;其他
测试该集合是否是另一个适当的子集,即Set&lt; = other and set!=其他。
https://docs.python.org/3/library/stdtypes.html#set
第一次找到字母中的字符时,您的方法返回true。这意味着该方法以布尔值为TRUE作为其输出结束。结果,您的循环不会继续,也不会检查其余字符。
要解决此问题,您可以更改代码以使其看起来像:
for ch in s:
if ch not in alphabet:
return False
return true
通过这种方式,当找到不在字母中的字符(返回false)或检查所有字符并且已检查所有字符并且都在字母中时,该方法要么完成(返回true)。
。