Результат reduce
должен быть действительным входным для функции сокращения; ваша функция сокращения ожидает последовательность по крайней мере с одним элементом, но вы возвращаете int
. Просто измените код на:
[total_population] = functools.reduce(lambda a, b: (a[0] + b[0],), mid_points)
, чтобы добавить слой tuple
обертывания, чтобы индексация продолжала работать, а скобки в конце распаковывают полученный единственный элемент 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
, а все последующие 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)
, поскольку на самом деле вам просто нужно сделать две вещи; извлеките первый элемент каждого ввода и просуммируйте их.