繁体   English   中英

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

[英]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'字符,值1sum()函数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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM