簡體   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