私が提案しようとしていることは理想的ではないことを私は知っていますが、これは私の貢献のために得ることができる限り近いと思います。これは、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
このようにして、タプルの中間タプル(つまり、1つの「削減」の後)は次のようになります。
((3, 4, 2.8284271247461903), (1,8,0))