Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找字符串中的多个列表项_Python - Fatal编程技术网

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刚刚在您的评论之前修复了。-1
strip
只删除尾随字符和前导字符<代码>s.translate(无,'aeiou')
是一个选项。我的错。我正在检查字符串方法,打算使用translate而不是split,但我的大脑把它搞乱了。为了提高速度和清晰度,我建议使用
元音=set('aeiou')
。这有两个优点:1)在内部,这变成了
{'a','e','i','o','u'}
,这实际上是代码的意图,因为'aeiou'
中的
i可以匹配'eou',而这不是OP想要的,2)
设置成员身份很快(这不是一个真正的问题,因为iterable是5个元素,但它可能会影响更长的字符串)。