0

我需要帮助: 找出不包含五个元音和三个 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

这虽然行不​​通...

4

5 回答 5

2

您检查 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
于 2013-02-24T06:23:34.467 回答
2

既然其他人已经告诉你问题出在哪里,我将提供我自己的解决方案。这可能是最好的方法,我不明白为什么不使用string.count()-method:

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
于 2013-02-24T09:30:53.590 回答
1

这是一个略有不同的解决方案。

首先,我们建立一个set元音。检查特定角色是否在此集合中非常快;比签入列表更快。此外,我们在函数外部构建它一次,而不是每次调用函数时都构建它。

我们使用any()生成器表达式来检查每个字符以查看它是否在集合中。如果任何字符在元音集中,我们返回 False。

接下来,我们使用sum()生成器表达式来计算有多少个'y'字符;对于每个字符 a 'y',该值1sum()函数相加。我们返回此结果是否为 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"))
于 2013-02-24T09:04:51.593 回答
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
于 2013-02-24T09:12:28.430 回答
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)
于 2013-02-24T13:58:04.757 回答