python中的路径

时间:2016-09-12 22:29:30

标签: python python-3.x

考虑一个矩形网格。

我想要一种简短而优雅的方式来生成从[x0,y0][x1,y1]的直线路径,其中x0=x1y0 = y1

例如,在输入[1,3], [3,3]上,应生成输出[[1,3],[2,3],[3,3]。同样,如果输入是[3,3], [1,3]

我尝试了[[i,j] for i in range(self.origin[0],self.end[0]+1) for j in range(self.origin[1], self.end[1]+1)],但它仅适用于订购输入的情况。

2 个答案:

答案 0 :(得分:3)

您的问题指出x -> y的解决方案应与解决方案y -> x相同,即我们只对定义路径上的点感兴趣,而不是对这些点的任何排序感兴趣。如果这是真的,那么只需找出哪个路径具有较小的x(或y)并将其指定为原点。

origin = (3,3)
dest = (1,3)

origin, dest = sorted([origin, dest])

path = {(i,j) for i in range(origin[0], dest[0]+1) for j in range(origin[1], dest[1]+1)}
# note that this is now a set comprehension, since it doesn't make any sense
# to use a list of unique hashable items whose order is irrelevant
当然,这解决了任何无阻碍的二维寻路。如果您知道只有一个方向在变化,那么只能朝那个方向看。

origin, dest = sorted((origin, dest))
if origin[0] == dest[0]:  # y is changing
    path = {(origin[0], j) for j in range(origin[1], dest[1]+1)}
else:  # x is changing
    path = {(i, origin[1]) for i in range(origin[0], dest[0]+1)}

答案 1 :(得分:1)

步骤参数添加到您的范围,从而获得开始和放大的符号。结束差异:

x_dir = copysign(1, self.end[0] - self.origin[0])
... for i in range(self.origin[0], self.end[0]+1, x_dir) ...

同样为y方向做。