解决我试图计算字符串中元音数量的问题。我写了以下代码:
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 ...感谢帮助。
答案 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'])