使用reduce函数的lambda时出现'int' object is not subscriptable错误
问题分析与解决
错误原因
reduce的执行逻辑是核心问题:
- 当列表只有2个元组时,
reduce仅调用一次lambda:传入前两个元组作为a和b,计算a[1]+b[1]得到整数后直接返回,不会触发后续调用,所以能正常运行。 - 当元组数量超过2个时,
reduce会把第一次lambda返回的整数结果作为下一次调用的a参数,而b是第三个元组。此时a已经是整数,再执行a[1]就会触发TypeError: 'int' object is not subscriptable——整数没有下标可访问。
正确写法
方法1:修正reduce的累积逻辑
给reduce指定初始累积值,让a始终代表当前的求和结果(整数),b代表遍历到的元组:
from functools import reduce exp = [ ('Dinner', 80), ('Car repair', 120), ('Netflix', 30), ('Rocket Fuel', 32) ] sumo = reduce(lambda a, b : a + b[1], exp, 0) # 0是初始累积值 print(sumo) # 输出262
执行流程:第一次调用时a=0,b是第一个元组,计算0+80=80;第二次a=80,b是第二个元组,计算80+120=200,以此类推直到遍历完所有元组。
方法2:用内置sum更简洁
没必要强行用reduce,Python内置的sum搭配生成器表达式更直观易读:
exp = [ ('Dinner', 80), ('Car repair', 120), ('Netflix', 30), ('Rocket Fuel', 32) ] sumo = sum(item[1] for item in exp) print(sumo) # 输出262
生成器表达式item[1] for item in exp会逐个取出每个元组的第二个元素,sum直接完成求和。
内容的提问来源于stack exchange,提问作者not_like_theketchup
相关产品推荐
相关产品推荐

