Python functools reduce()给出TypeError:';int';对象不可下标

Python functools reduce()给出TypeError:';int';对象不可下标,python,python-3.x,list,reduce,functools,Python,Python 3.x,List,Reduce,Functools,我对functools.reduce()有问题。 它返回int对象不可下标 total_population = functools.reduce(lambda a, b: a[0] + b[0], mid_points) 元组的变量“中点”列表:示例如下图所示 但当我试着在上面的代码行: li = [(1,"a"), (2,"b")] 它给出了正确的输出,即3 请帮忙!我该怎么办 减少的结果需要是减少功能的有效输入;还原函数要求序列至少包含一个元素,

我对functools.reduce()有问题。 它返回int对象不可下标

total_population = functools.reduce(lambda a, b: a[0] + b[0], mid_points)
元组的变量“中点”列表:示例如下图所示

但当我试着在上面的代码行:

li = [(1,"a"), (2,"b")]
它给出了正确的输出,即3

请帮忙!我该怎么办


减少的结果需要是减少功能的有效输入;还原函数要求序列至少包含一个元素,但返回的是
int
。只需将代码更改为:

[total_population] = functools.reduce(lambda a, b: (a[0] + b[0],), mid_points)
添加一层
tuple
包装,以便索引继续工作,以及。如果
mid_points
是单个元素,则会中断,因此如果可能:

total_population, *_ = functools.reduce(lambda a, b: (a[0] + b[0],), mid_points)
稍微安全一些,因为它只是将结果中的任何额外元素捕获到忽略的
列表中

另一种选择(感谢@deceze提醒我)是给
reduce
一个起始值,因此
a
在第一次通话和所有后续通话中始终是
int

total_population = functools.reduce(lambda a, b: a + b[0], mid_points, 0)
reduce
的最后一个参数是第一个
a
,所有后续
a
都是以前调用的结果。当然,这也可以通过第三种方式进行简化,以完全避免
reduce

from operator import itemgetter

total_population = sum(map(itemgetter(0), mid_points))

# Or without an import, but ever-so-slightly slower:
total_population = sum(pt[0] for pt in mid_points)

因为实际上你只需要做两件事;提取每个输入的第一个元素,并求和。

a[0]+b[0]
返回一个int,它将作为
a
输入到下一次迭代中……我宁愿为
reduce
添加一个起始参数,以确保
a
始终是一个整数……@deceze:当然。我再补充一句,谢谢!终于明白我的代码出了什么问题。