live long and prosper

使用python求解曼哈顿距离问题

所谓曼哈顿距离是指对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此曼哈顿距离又称为出租车距离,曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。
求解该问题的代码如下:

def func(x,y):
    return sum(map(lambda i, j: abs(i-j), x, y))

print(func([1,2],[3,4]))

求解两个坐标之间的曼哈顿距离,则要算出x轴上的距离加上y轴上的距离
这串代码中涉及多个知识点,我们依次点明:

1、abs()

abs()函数的名字是从英文单词absolute衍生而来,单词的意思就是“绝对值”,顾名思义该函数返回数字的绝对值

abs(45)
abs(-45)
abs(-3.14)

结果为:

45
45
3.14

如果传入到abs()的是负数,那么abs()则会返回复数与它的共轭复数的平方根,例如传入复数a+bi,返回结果为a2+b2开方。

2、map()函数

下面是来自python3.10官方文档说明:

map(function, iterable, …)
返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。

较为通俗的来讲就是将传入的序列中的每个值都从function函数中过一遍。而上面代码中的map()函数就将传入的x,y都从lambda表达式中“过”一遍,处理一遍。
我们求解方法是:
1、接受两个坐标。
2、对两个坐标的x值求解差的绝对值。
3、对y值求解差的绝对值。
4、讲两个绝对值相加。

map(lambda i, j: abs(i-j), x, y)

根据上面代码:map()函数同时接收了两个序列,函数对两个序列没有任何偏见,将会同时处理两个序列中的第一个元素,也就是两个坐标的x值,求出x值的差的绝对值;然后按照同样的模式处理两个序列的第二个元素,也就是两个坐标的y值。实例还有:

def func(x):
     print(x**2)


print(list(map(func,[1,2,3,4,5])))

这里还将map()返回的对象转换为列表

3、lambda表达式

lambda表达式可以认为是将函数简化而来的语法,避免了函数的格式,简化了代码,但从本质上讲,它还是函数,可以传入传出值。

lambda i, j: abs(i-j)

这里的lambda表达式就可以转换为:

def function(i,j):
    return abs(i-j)
总结

求解曼哈顿距离问题涉及到了lambda表达式、map()函数、abs()函数,其中较难理解部分有lambda表达式和map()函数的传值问题。最后只需使用sum()函数讲绝对值相加即可。
欢迎斧正

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐