[英]Python: Indexing a string with specific conditions
我需要以下帮助: 查找不包含五个元音和三个y的单词数量。
到目前为止,我有:
def no_vowels_yyy(s):
count = 0
list_of_vowels = ['a', 'e', 'i', 'o', 'u']
for i in range(0, len(s)):
if s[i] not in list_of_vowels and (s[i] == 'y') == 3:
return True
return False
虽然这不起作用...
您检查y的数量(s[i] == 'y') == 3:
是导致它不起作用的原因。 将s[i]
与'y'
会得到布尔(真/假)结果,而不是匹配数。 由于您正在遍历,因此您只需保留找到的y数即可。
def no_vowels_yyy(s):
count = 0
list_of_vowels = ['a', 'e', 'i', 'o', 'u']
for i in range(0, len(s)):
if s[i] in list_of_vowels:
return False
if s[i] == 'y':
count += 1
return count == 3
由于其他人已经告诉过您问题所在,因此我将提供自己的解决方案。 这可能是最好的方法,我不明白为什么不使用string.count()
-方法:
def no_vowels_yyy(s):
if any(c in {'a', 'e', 'i', 'o', 'u'} for c in s):
return False
return s.count('y') == 3
这是一个略有不同的解决方案。
首先,我们构建一set
元音。 检查特定字符是否在此集合中非常快捷; 比检查列表更快。 另外,我们在函数外部只构建一次,而不是每次调用函数时都构建一次。
我们将any()
与生成器表达式一起使用,该表达式检查每个字符以查看其是否在集合中。 如果元音组中有任何字符,则返回False。
接下来,我们使用带有生成器表达式的sum()
来计算有多少个'y'
字符; 对于每个'y'
字符,值1
由sum()
函数sum()
。 我们返回此结果是否为3。
这比遍历带有索引的字符串和更新计数器变量要快一些。 这更多是“ Pythonic”解决方案。 另一方面,这使字符串循环两次而不是一次。
_vowels = set(['a', 'e', 'i', 'o', 'u'])
def no_vowels_yyy(s):
if any(ch in _vowels for ch in s):
return False
return s.count('y') == 3
print(no_vowels_yyy("zyzyxy"))
只是为了显示另一种方式...:
from collections import Counter
def func(text):
freq = Counter(text)
return freq['y'] == 3 and not (freq.viewkeys() & 'aeiou')
仅具有一次解析的优点,但不会使元音短路...
否则,要尽快短路:
y_count = 0
for ch in word:
if ch in {'a', 'e', 'i', 'o', 'u'}:
return False
elif ch == 'Y':
y_count += 1
if y_count > 3:
return False
return y_count == 3
def no_vowels_yyy(s, _vowels=set("aeiou")):
return s.count("y") == 3 and _vowels.isdisjoint(s)
print(no_vowels_yyy("zyzyxy")) # -> True
或更可读的版本:
def no_vowels_yyy(s):
return s.count("y") == 3 and all(c not in "aeiou" for c in s)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.