问题描述
我有一个单词列表,我正在尝试计算所有单词组合的总长度。 为什么是我的代码:
words = ["a","ab",'adsf']
wordlen = reduce(lambda x,y: len(x) + len(y),words)
给我
Traceback (most recent call last)
wordlen = reduce(lambda x,words)
TypeError: object of type 'int' has no len()
解决方法
以下是解决问题的一些不同方法:
.gitignore
输出
words = ['zz','abc']
total_len = sum(len(x) for x in words)
print(total_len)
,
如果要使用reduce
,请使用初始化参数并删除第一个vals.assign(spArrayInp.begin(),spArrayInp.end());
:
len()
打印:
from functools import reduce
words = ['Hello','World','This','Is','Example']
wordlen = reduce(lambda x,y: x + len(y),words,0)
print(wordlen)
,
受@Tomerikoo的评论启发,我对reduce(又名fold)进行了更深入的研究。其他语言中的许多reduce / fold实现都要求该操作具有关联性。当操作是关联操作时,应用顺序无关紧要。例如,无论您在何处加上括号,len(“ a”)+ len(“ b”)+ len(“ c”)都会产生相同的结果(因为有限域上的整数加法是关联的)。
当操作不关联时,就会发生混乱。在这种情况下,功能的应用顺序很重要。这是左右折的概念出现的时候。它们都是说明如何添加括号的方式。
还要注意,折叠需要两个功能: 函数i将类型A的对象转换为类型B的另一个对象 Functoin ii将多个B型对象简化为一个C型对象。
左折叠和右折叠本质上使用成对运算,这使一个函数可以将两个功能组合为一个。这就是@Andrej Kesely的答案。