Я знаю, что то, что я собираюсь предложить, не является идеальным, но я думаю, что это настолько близко, насколько я могу получить за мой вклад. Решить эту забавную проблему, даже если это не самое традиционное применение метода Reduce.
Ключевой проблемой, как представляется, является отслеживание расстояния от точки до точки без перезаписи самих точек - добавление еще одного «измерения» к каждой точке дает вам поле, с помощью которого вы можете отслеживать расстояние пробега.
iterable = ((1,2,0), (3,4,0), (1,8,0))
# originally ((1,2), (3,4), (1,8))
from math import sqrt
def func(tup1, tup2):
'''function to pass to reduce'''
# extract coordinates
x0 = tup1[0]
x1 = tup2[0]
y0 = tup1[1]
y1 = tup2[1]
dist = tup1[2] # retrieve running total for distance
dx = x1 - x0 # find change in x
dy = y1 - y0 # find change in y
# add new distance to running total
dist += sqrt(dx**2 + dy**2)
# return 2nd point with the updated distance
return tup2[:-1] + (dist,) # e.g. (3, 4, 2.828)
Теперь уменьшите:
reduce(func, iterable)[-1]
# returns 7.3005630797457695
Таким образом, промежуточный кортеж кортежей (т.е. после одного «сокращения») становится:
((3, 4, 2.8284271247461903), (1,8,0))