reduce 的结果需要是归约函数的有效输入;您的归约函数需要一个至少包含一个元素的序列,但您返回的是 int。只需将代码更改为:
[total_population] = functools.reduce(lambda a, b: (a[0] + b[0],), mid_points)
添加一层tuple 包装,以便索引继续工作,brackets at the end unpack the resulting single element tuple.如果mid_points 是单个元素,这将中断,所以如果可能的话:
total_population, *_ = functools.reduce(lambda a, b: (a[0] + b[0],), mid_points)
稍微安全一些,因为它只是将结果中的任何额外元素捕获到被忽略的list中。
另一种选择(感谢@deceze 提醒我)是给reduce 一个起始值,所以a 始终是int,无论是第一次调用还是所有后续调用:
total_population = functools.reduce(lambda a, b: a + b[0], mid_points, 0)
reduce 的最后一个参数是第一个 a,所有后续的 as 都是先前调用的结果。当然,这也可以通过第三种方式简化,完全避免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)
因为你真的只需要做两件事;提取每个输入的第一个元素,并将它们相加。