关于lambda表达式中sum()统计元音的原理解析及自定义排序函数报错问题咨询
首先来拆解原代码里sum(v in 'aeiou' for v in word)的工作原理:
在Python中,布尔值是整数的子类——True等价于1,False等价于0。当你写v in 'aeiou'时,每个字符v都会被判断是否是元音,得到一个布尔值。而sum()函数可以直接对这些布尔值组成的生成器表达式求和,本质就是把所有True(元音字符)对应的1加起来,自然就得到了单词里的元音数量。
举个例子,单词"banana"的判断过程是:
b in 'aeiou'→False(0)a in 'aeiou'→True(1)n in 'aeiou'→False(0)a in 'aeiou'→True(1)n in 'aeiou'→False(0)a in 'aeiou'→True(1)
sum的结果就是0+1+0+1+0+1=3,正好是单词里的元音数。
接下来看看你写的代码存在的问题:
sum(v)的逻辑错误
你这里的v是单个字符字符串,sum()函数无法直接对字符串求和(它需要可迭代的数值类型),这就是报错TypeError: unsupported operand type(s) for +: 'int' and 'str'的原因。而且你想要统计的是元音的数量,不是字符本身的求和。变量
vowels的作用域和赋值错误
你的循环里每次处理字符v时都会覆盖vowels的值,最后vowels只会保存最后一个字符的错误计算结果,根本没有统计每个单词的元音数。sorted的key参数使用错误sorted的key需要是一个函数,这个函数会接收序列里的每个元素(每个单词),返回用于排序的依据值。你直接传vowels这个变量,它是一个固定值,无法为每个单词单独计算排序依据。
如果想要写成更易读的版本,可以把统计元音的逻辑抽成一个单独的函数,替代原代码里的lambda:
def count_vowel_count(word): count = 0 for v in word: if v in 'aeiou': count += 1 return count def sort_vowel(sequence): return sorted(sequence, key=count_vowel_count, reverse=True)
这个版本和原代码的逻辑完全一致,只是把lambda的匿名函数改成了具名函数,更容易理解。
内容的提问来源于stack exchange,提问作者PreacherBaby

