Python 查找字符串中的多个列表项
我正在解决一个问题,我试图计算字符串中元音的数量。我编写了以下代码:Python 查找字符串中的多个列表项,python,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) 虽然上述方法可行,但我想知道如何更简单地做到这一点,方法是创建一个所有元音的列表,
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…感谢您的帮助。例如,您可以像对待python中的列表一样对待字符串(因为它们都是可编辑的)
vowels = 'aeiou'
sum(1 for i in s if i.lower() in vowels)
为了完整性起见,其他人建议
元音=set('aeiou')
允许不匹配检查,例如元音中的'eio'。但是请注意,如果您在for循环中一次迭代一个字符,则不会遇到此问题。无需创建列表,您可以使用类似'aeiou'
的字符串来执行此操作:
>>> vowels = 'aeiou'
>>> s = 'fooBArSpaM'
>>> sum(c.lower() in vowels for c in s)
4
您可以使用列表理解进行筛选,如下所示:
len([letter for letter in s if letter in 'aeiou'])
下面是一种奇怪的解决方法:
vowels = len(s) - len(s.translate(None, 'aeiou'))
使用s.translate(None,'aeiou')
所做的是创建字符串的副本,删除所有元音。然后检查长度的差异
特别注意:我使用它的方式是均匀的
什么是元音?
但是,请注意,此处提供的方法仅准确地替换translate
string方法的第二个参数中的字符。特别是,这意味着它将不会替换大写字符,更不用说重音字符(如áèǔ)
大写元音
解决大写字母比较容易,只需在已转换为小写的字符串副本上进行替换:
vowels = len(s) - len(s.lower().translate(None, 'aeiou'))
重音元音
这是一个有点复杂,但由于我们知道最好的方法来做这件事。由此产生的代码将是:
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'))
一种方法是:为了学习,如果您想保持当前的For循环结构,请将多个布尔检查更改为如果i in('a','e','i','o','u'):
@JesseMu如果i in('a','e','i','o','u'):
更合适,因为如果i in'aeiou',:
也将匹配i='eio'
,这不是代码的意图。@SethMMorton很好,将字符串编辑为列表不完全正确。字符串和列表都是iterables
,允许它们进行迭代。sum([i.lower()在s中的元音中表示i])
也可以工作,因为python中的True==1
。@SethMMorton同意更惯用的说法。因为这是Ashwini的帖子中提供的,所以我将按原样离开。正确的语法是set(['a','e','I','o','u'])
或set('aeiou')
,因为set
必须取一个iterable。@SethMMorton刚刚在您的评论之前修复了。-1strip
只删除尾随字符和前导字符<代码>s.translate(无,'aeiou')
是一个选项。我的错。我正在检查字符串方法,打算使用translate而不是split,但我的大脑把它搞乱了。为了提高速度和清晰度,我建议使用元音=set('aeiou')
。这有两个优点:1)在内部,这变成了{'a','e','i','o','u'}
,这实际上是代码的意图,因为'aeiou'
中的i可以匹配'eou',而这不是OP想要的,2)设置成员身份很快(这不是一个真正的问题,因为iterable是5个元素,但它可能会影响更长的字符串)。