我需要帮助: 查找不包含五个元音和三个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
这不起作用......
答案 0 :(得分:2)
您检查y (s[i] == 'y') == 3:
的数量是导致它无法正常工作的原因。将s[i]
与'y'
进行比较会得到布尔值(true / false),而不是匹配数。由于你正在循环,你可以只计算你找到的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
答案 1 :(得分:2)
由于其他人已经告诉你这是什么问题,我只会提供自己的解决方案。这可能是最好的方法,我不明白为什么不使用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
答案 2 :(得分:1)
这是一个稍微不同的解决方案。
首先,我们构建一个set
个元音。检查特定字符是否在此集合中是否非常快;比检查列表更快。此外,我们在函数外部构建一次,而不是每次调用函数时都构建它。
我们将any()
与生成器表达式一起使用,该表达式检查每个字符以查看它是否在集合中。如果任何字符在元音集中,我们返回False。
接下来,我们使用带有生成器表达式的sum()
来计算有多少'y'
个字符;对于'y'
的每个字符,1
函数会添加值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"))
答案 3 :(得分:1)
只是为了表明另一种方式......:
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
答案 4 :(得分:1)
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)