lambda 练习中的 sum() 需要详细说明

sum() in lambda exercise elaboration needed

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

练习主体:

Given a list of strings, sort them according to how many vowels they contain.

代码:

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

从这里开始:

lambda 启动 'anonymous function' 并采用参数 'word'。但是我不知道 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'

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

您的代码的主要错误是您试图对字符使用 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']
>>>

这是一个有点“臭”的代码,因为对于不熟悉 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)

Lambdas 只是一种将使用 defreturn 的样板简化为一个可能 returns 东西的语句的方法。

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

它起作用的主要原因是因为 Python True 等于 1 而 False 等于 0.

> True + True
2
> False + False
0

因此 (v in 'aeiou' for v in word) 为单词的每个字母生成一个布尔值,并且 sum 通过将所有布尔值相加来“计算” True

好吧,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)