【问题标题】:sum() in lambda exercise elaboration neededsum() 在 lambda 练习中需要详细说明
【发布时间】:2021-09-27 04:21:06
【问题描述】:

我正在阅读有关 lambda 的文章,尽管我可以说我理解它的用途,但我似乎仍然无法获得更多代码行。

练习的主体:

给定一个字符串列表,根据它们包含的元音数量对它们进行排序。

代码:

   def sort_vowel(sequence):
        return sorted(sequence, key=lambda word: sum(v in 'aeiou' for v in word), reverse= True)

从这里开始:

lambda 启动“匿名函数”并采用参数“单词”。但我不知道 sum() 如何计算单词中的元音,

我试着用更通用的方式来写它:

def sort_vowel(sequence):
    for word in sequence:
        for v in word:
            if v in 'aeiou':
                vowels = sum(v)
    return sorted(sequence, key= vowels)

这个有什么问题吗?我明白了

TypeError: unsupported operand type(s) for +: 'int' and 'str'

无论如何我想了解它是如何总结字符串中的元素以及我编写的函数有什么问题?...

【问题讨论】:

    标签: python loops sorting lambda sum


    【解决方案1】:

    业界称它为有点“臭”的代码,因为对于不熟悉 Python 的所有怪癖的人来说很难理解。

    让我们从sorted 部分开始。当您在sorted 中使用key= 时,它会使用该函数产生一些与存储函数兼容的输出。在原始情况下,使用的函数是 lambda,但您也可以轻松地做到这一点。

    def count_vowels(word):
        return sum(v in 'aeiou' for v in word)
    
    def sort_vowel(sequence):
        return sorted(sequence, key=count_vowels, reverse= True)
    

    Lambda 只是一种将使用 defreturn 的样板简化为一个可能返回某些内容的语句的方法。

    接下来可能令人困惑的事情:为什么count_vowels 有效?

    它起作用的主要原因是因为在Python中True等于1,False等于0。

    > True + True
    2
    > False + False
    0
    

    因此,(v in 'aeiou' for v in word) 为单词的每个字母生成一个布尔值,sum 本质上是通过将所有布尔值相加来“计数”Trues。

    【讨论】:

    • 所以基本上sum可以写成:`for v in word: if v in 'aeiou': sum(v)?
    • @PreacherBaby 没有。你不能直接 sum(v) 因为它们是字符串。原来的 for 循环将它们变成布尔值,然后执行求和操作
    • 原始循环将它们变成单行布尔值?在v in 'aeiou 部分?
    【解决方案2】:

    嗯,lambda word: sum(v in 'aeiou' for v in word) 涉及布尔值具有数值的事实。

    翻译成:

    def count_vowels(word):
        count = 0
        for v in word:
            if v in 'aeiou':
               count += 1
        return count
    

    当这个技巧和总和被消除时。

    你的函数可以定义为

    def sort_vowel(sequence):
        return sorted(sequence, key=count_vowels, reverse=True)
    

    【讨论】:

      【解决方案3】:

      您的代码的主要错误是您试图对字符使用sum 函数。 (它适用于数字类型。)

      由于程序在它发生之前终止而没有出现的另一个是您将vowels 作为参数传递给key 参数。事实上,vowels 对象是什么并不干净。 key 参数需要一个函数。原始程序没有单独定义一个,而是将其作为 lambda 传递。

      要查看它“写出”,请考虑以下示例:

      >>> def count_vowels(word):
      ...     count = 0
      ...     for c in word:
      ...             if c in 'aeiou':
      ...                     count += 1
      ...     return count
      ...
      >>> count_vowels('vowel')
      2
      >>> count_vowels('bcdfg')
      0
      >>> seq = ['abcde', 'vowel', 'aeiou', 'python', 'uvwxyz']
      >>> sorted(seq, key=count_vowels, reverse=True)
      ['aeiou', 'abcde', 'vowel', 'python', 'uvwxyz']
      >>>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多