Python 求解测量点列表(x,y)中点之间距离的函数
我正在写一个函数路由。此函数具有一个强制参数points,该参数接受点列表。如果依次访问给定列表中的每个点,则函数必须返回行驶的总距离。除强制参数外,该函数还有两个可选参数: 循环:获取一个布尔值,该值指示路线的终点是否等于其起点(True)或(False);此参数的默认值为False 距离:采用距离函数,用于计算给定路线中两个连续点之间的总距离;如果没有向该参数传递显式值,则必须使用欧几里德距离 问题:任何人都知道上一个定义route()如何解决这种情况:Python 求解测量点列表(x,y)中点之间距离的函数,python,Python,我正在写一个函数路由。此函数具有一个强制参数points,该参数接受点列表。如果依次访问给定列表中的每个点,则函数必须返回行驶的总距离。除强制参数外,该函数还有两个可选参数: 循环:获取一个布尔值,该值指示路线的终点是否等于其起点(True)或(False);此参数的默认值为False 距离:采用距离函数,用于计算给定路线中两个连续点之间的总距离;如果没有向该参数传递显式值,则必须使用欧几里德距离 问题:任何人都知道上一个定义route()如何解决这种情况: route([(41.79, 13.
route([(41.79, 13.59), (41.68, 14.65), (21.16, -4.79)], distance=lambda p1, p2: abs(p1[0] + p2[0]))
正确答案:146.31
我提到的代码的一部分:
if cycle == False and distance is λ(p1, p2): abs(p1[0] + p2[0]):
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = euclidean(a[0], b[0])
l.append(d)
count += 1
return sum(l)
在这一部分中,我被第一条规则和更进一步的规则卡住了
工作正常的完整代码(上述部分除外):
我同意邓肯的观点。你有太多的重复。 这里有一个更直接的方法:
euclidean=lambda p1,p2:sqrt(sum((p1_i-p2_i)**2表示p1_i,p2_i在zip中(p1,p2)))
曼哈顿=lambda p1,p2:sum(在zip(p1,p2)中p1_i,p2_i的abs(p1_i-p2_i)
棋盘=lambda p1,p2:max(用于压缩(p1,p2)中p1_i,p2_i的abs(p1_i-p2_i))
def路线(点,周期=假,度量=欧几里德):
l=0.0
对于范围内的i(长度(点)-1):
l+=度量(点[i],点[i+1])
如果循环:
l+=度量(点[-1],点[0])
返回l
可以传递任何度量函数,然后使用它们代替欧几里德度量。不要比较函数:两个不同的lambda表达式不会与
is
或=
进行相等比较。只需拨打距离(a,b),消除所有重复。这是一个有用的答案。
def euclidean(a, b):
'''
>>> euclidean((42.36, 56.78), (125.65, 236.47))
198.05484139500354
'''
from math import sqrt
return sqrt(sum((a - b)**2 for a, b in zip(a, b)))
def manhattan(c, d):
'''
>>> manhattan((42.36, 56.78), (125.65, 236.47))
262.98
'''
return sum(abs(c - d) for c, d in zip(c, d))
def chessboard(e, f):
'''
>>> chessboard((42.36, 56.78), (125.65, 236.47))
179.69
'''
return max(abs(e - f) for e, f in zip(e, f))
def route(points, cycle=False, distance=None):
'''
>>> route([(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)])
21.861273201261746
>>> route(cycle=True, points=[(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)])
42.60956710702662
>>> route([(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)], distance=manhattan)
23.45
>>> route([(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)], cycle=True, distance=manhattan)
45.42
'''
if cycle == False and distance is None:
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = euclidean(a, b)
l.append(d)
count += 1
return sum(l)
if cycle == False and distance is euclidean:
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = euclidean(a, b)
l.append(d)
count += 1
return sum(l)
if cycle == False and distance is λ(p1, p2): abs(p1[0] + p2[0]):
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = euclidean(a[0], b[0])
l.append(d)
count += 1
return sum(l)
if cycle == True and distance is None:
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = euclidean(a, b)
l.append(d)
count += 1
f = points[0]
g = points[-1]
r = euclidean(g, f)
k = sum(l) + r
return k
if cycle == True and distance is euclidean:
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = euclidean(a, b)
l.append(d)
count += 1
f = points[0]
g = points[-1]
r = euclidean(g, f)
k = sum(l) + r
return k
if cycle is False and distance is manhattan:
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = manhattan(a, b)
l.append(d)
count += 1
return sum(l)
if cycle is True and distance is manhattan:
l = list()
count = 0
for items in range(len(points)-1):
a = points[items]
b = points[items+1]
d = manhattan(a, b)
l.append(d)
count += 1
f = points[0]
g = points[-1]
r = manhattan(g, f)
k = sum(l) + r
return k