在字符串中查找多个列表项

时间:2014-02-26 17:06:34

标签: python

解决我试图计算字符串中元音数量的问题。我写了以下代码:

def vowel_count(s):
    count = 0
    for i in s:
        if i == 'a' or i == 'e' or i == 'i' or i == 'o' or i == 'u':
            count += 1
    print count
vowel_count(s)

虽然上述工作正常,但我想知道如何更简单地通过创建所有元音的列表,然后通过它循环我的If语句,而不是多个布尔检查。我确信使用导入模块可以实现更优雅的方式,但对此类解决方案感兴趣。

相对noob ...感谢帮助。

4 个答案:

答案 0 :(得分:4)

你实际上可以像处理python中的列表一样处理字符串(因为它们都是可迭代的),例如

vowels = 'aeiou'
sum(1 for i in s if i.lower() in vowels)

为了完整起见,其他人建议vowels = set('aeiou')允许不匹配'eio' in vowels之类的匹配。但请注意,如果您一次在for loop个字符中迭代字符串,则不会遇到此问题。

答案 1 :(得分:4)

无需创建列表,您可以使用'aeiou'之类的字符串来执行此操作:

>>> vowels = 'aeiou'
>>> s = 'fooBArSpaM'
>>> sum(c.lower() in vowels for c in s)
4

答案 2 :(得分:1)

一个奇怪的方法是:

vowels = len(s) - len(s.translate(None, 'aeiou'))

您正在使用s.translate(None, 'aeiou')正在创建删除所有元音的字符串副本。然后检查长度的差异。

特别说明:我使用它的方式是part of the official documentation

什么是元音?

请注意,此处介绍的方法仅替换完全 translate字符串方法的第二个参数中存在的字符。特别是,这意味着它不会取代大写版本的字符,更不用说重音字符了(比如áèïôǔ)。

大写元音

解决大写的问题很简单,只需对已转换为小写的字符串副本进行替换:

vowels = len(s) - len(s.lower().translate(None, 'aeiou'))

重音元音

这个有点复杂,但感谢this other SO question我们知道最好的方法。结果代码为:

from unicodedate import normalize

# translate special characters to unaccented versions
normalized_str = normalize('NFD', s).encode('ascii', 'ignore')
vowels = len(s) - len(normalized_str.lower().translate(None, 'aeiou'))

答案 3 :(得分:0)

您可以使用列表推导进行过滤,如下所示:

len([letter for letter in s if letter in 'aeiou'])