繁体   English   中英

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

[英]Find multiple list items within a string

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

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语句,而不是多次布尔检查来更简单地了解如何执行此操作。 我敢肯定,对于导入模块,还有一种更优雅的方法,但是对此类型的解决方案很感兴趣。

相对新手...感谢帮助。

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

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

为了完整起见,其他人建议使用vowels = set('aeiou')来允许不匹配的检查,例如'eio' in vowels 但是请注意,如果您一次在for loop中遍历字符串一次,则不会遇到此问题。

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

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

解决此问题的怪异方法如下:

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

您使用s.translate(None, 'aeiou')所做的是创建字符串的副本,以删除所有元音。 然后检查长度如何不同。

特别说明:我的使用方式甚至是官方文档的一部分

什么是元音?

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

大写元音

解决大写字母很容易,只需对已转换为小写字母的字符串副本执行替换:

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

重音元音

这个问题有些复杂,但是由于存在另一个SO问题,我们知道了最好的解决方法。 结果代码为:

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'))

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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