Python:使用特定条件索引字符串

时间:2013-02-24 06:14:46

标签: python python-2.7

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

这不起作用......

5 个答案:

答案 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)