0

これについて助けが必要です: 5 つの母音と 3 つの 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'と、一致の数ではなく、ブール値 (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
于 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

別の方法を示すために...:

from collections import Counter
def func(text):
    freq = Counter(text)
    return freq['y'] == 3 and not (freq.viewkeys() & 'aeiou')

解析が 1 つだけという利点がありますが、母音で短絡することはありません...

それ以外の場合は、できるだけ早く短絡してください。

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

ここでは、少し異なるソリューションを示します。

まず、set母音の a を作成します。特定の文字がこのセットに含まれているかどうかを確認するのは非常に高速です。リストをチェックインするよりも高速です。また、関数が呼び出されるたびにビルドするのではなく、関数の外で一度ビルドします。

any()各文字をチェックしてセット内にあるかどうかを確認するジェネレータ式で使用します。母音のセットに文字がある場合は、False を返します。

次に、sum()ジェネレータ式を使用して'y'文字数をカウントします。である文字ごとに、関数によって'y'1が追加されsum()ます。この結果が 3 かどうかを返します。

これは、インデックスを使用して文字列をループし、カウンター変数を更新するよりも少し高速です。これは、より「Pythonic」なソリューションです。一方、これは文字列を 1 回ではなく 2 回ループします。

_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
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 に答える