我有一个单词列表,我试图计算所有单词的总长度。为什么我的代码:
words = ["a", "ab", 'adsf']
wordlen = reduce(lambda x, y: len(x) + len(y), words)
给我:
Traceback (most recent call last)
wordlen = reduce(lambda x, y: len(x) + len(y), words)
TypeError: object of type 'int' has no len()
3条答案
按热度按时间wh6knrhe1#
下面是一个稍微不同的方法来解决这个问题:
输出
oo7oh9g92#
如果您想使用
reduce
,请使用初始化器参数并删除第一个len()
:图纸:
vs3odd8k3#
受到@Tomerikoo评论的启发,我对reduce做了更深入的研究(aka fold)。其他语言中的许多reduce/fold实现要求操作是关联的。当操作是关联的时,应用它的顺序并不重要。例如,len(“a”)+ len(“B”)+ len(“c”)生成相同的结果,无论你把括号放在哪里(因为有限域上的整数加法是结合的)。
当运算不结合时,就会出现混淆,这时函数的应用顺序很重要,这时就出现了左折和右折的概念,它们都规定了如何添加括号。
还要注意,fold需要两个函数:将类型A的对象转换为类型B的对象的函数i和将多个类型B的对象减少为类型C的单个对象的函数ii。
左折叠和右折叠本质上使用成对运算,允许将两个功能合并为一个,这就是@Andrej Kesely的答案。