【问题标题】:Count Vowels from a word list and return the number as a list从单词列表中计算元音并将数字作为列表返回
【发布时间】:2019-03-13 15:32:10
【问题描述】:

我只想定义一个函数 number_of_vowels,它返回字符串中元音的数量。

我的代码如下:

vowels='aeiou'
def number_of_vowels(word):
    return[len([letter.lower() for letter in word if letter in vowels])]
names = ["Ben", "April", "Zaber", "Alexis", "McJagger", "J.J.", "Madonna"]
number_of_vowels(names)

我的结果中只有 [0]。不知道为什么

【问题讨论】:

    标签: python string python-3.x list list-comprehension


    【解决方案1】:

    您正在输入一个列表,但您的逻辑仅适用于单个字符串:

    number_of_vowels('Bean')  # [2]
    

    您需要调整函数的输入,或者修改函数以计算列表中每个元素的元音数量。由于您希望输出是数字列表,因此我假设您正在寻找第二个选项。

    为此,只需在列表理解中添加一个额外的for 子句:

    def number_of_vowels(words):
        return [len([letter for letter in word if letter.lower() in vowels]) \
                for word in words]
    
    number_of_vowels(names)  # [1, 2, 2, 3, 2, 0, 3]
    

    但是,请注意中间人列表不是必需的。您可以将sum 与生成器表达式一起使用,利用True == 1False == 0 这一事实:

    vowels = set('aeiou')
    
    def number_of_vowels(words):
        return [sum(letter.lower() in vowels for letter in word) for word in words]
    
    number_of_vowels(names)  # [1, 2, 2, 3, 2, 0, 3]
    

    请注意一些进一步的更改以改进您的算法:

    1. 检查letter.lower() in vowels 而不是仅仅创建一个小写字母列表。否则元音为大写字母,例如在“四月”中,将被忽略。
    2. 将元音转换为 set 以实现 O(1) 查找复杂度。

    【讨论】:

      【解决方案2】:

      我会使用 regular expressionslist comprehension 来完成这项任务。

      import re
      names = ["Ben", "April", "Zaber", "Alexis", "McJagger", "J.J.", "Madonna"]
      [len(re.findall('a|e|i|o|u', name.lower())) for name in names]
      >>> [1, 2, 2, 3, 2, 0, 3]
      

      【讨论】:

        【解决方案3】:

        让我们检查一下您收到[0] 的原因。您将返回一个包含单个元素的列表,该元素是您的列表理解 [letter.lower() for letter in word if letter in vowels] 生成的列表的 len

        这个列表理解是做什么的?它为单词列表中的每个单词创建小写单词,但前提是它位于vowels 中。由于您的单词列表中没有一个单词是in aeiou,所以这个列表是空的。

        你可能打算把它写成:

        def number_of_vowels(word):
            return len([letter.lower() for letter in word if letter.lower() in vowels])
        
        names = ["Ben", "April", "Zaber", "Alexis", "McJagger", "J.J.", "Madonna"]    
        vowel_count = [number_of_vowels(name) for name in names]
        

        如果没有,你当然可以参考@jpp的解决方案,很酷。

        【讨论】:

          猜你喜欢
          • 2021-07-03
          • 1970-01-01
          • 2015-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多