如何将路径的 (X,Y) 坐标列表拆分为单独的 X 和 Y 坐标列表?
How to split list of (X,Y) coordinates of path into separate list of X and Y coordinates?
在下面的函数中,'graph'是一个由1、0和一个'two'(分别是障碍物、空地和目标)组成的二维网格列表,'start'是指向开始搜索。
def bfs(图,开始):
fringe = [[start]]
# Special case: start == goal
if start.val == 'g':
return [start]
start.visited = True
# Calculate width and height dynamically. We assume that "graph" is dense.
width = len(graph[0])
height = len(graph)
# List of possible moves: up, down, left, right.
moves = [(-1, 0), (1, 0), (0, -1), (0, 1)]
while fringe:
# Get first path from fringe and extend it by possible moves.
path = fringe.pop(0)
#print path
node = path[-1]
pos = node.pos
# Using moves list (without all those if's with +1, -1 etc.) has huge benefit:
# moving logic is not duplicated. It will save you from many silly errors.
for move in moves:
# Check out of bounds. Note that it's the ONLY place where we check it.
if not (0 <= pos[0] + move[0] < height and 0 <= pos[1] + move[1] < width):
continue
neighbor = graph[pos[0] + move[0]][pos[1] + move[1]]
if neighbor.val == 'g':
return path + [neighbor]
elif neighbor.val == 'o' and not neighbor.visited:
neighbor.visited = True
fringe.append(path + [neighbor]) # creates copy of list
raise Exception('Path not found!')
TRANSLATE = {0: 'o', 1: 'x', 2: 'g'}
graph = [[Node(TRANSLATE[x], (i, j)) for j, x in enumerate(row)] for i, row in enumerate(graph)]
# Find path
path = bfs(graph, graph[4][4])
当我打印 path 的值时,得到以下内容:
Path
[(4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (3, 8), (2, 8), (1, 8), (1, 9)]
这些是 x 和 y 坐标。
现在如何获取坐标作为单独的 'x' 和 'y' 坐标的列表?
我的首选输出是
X_list=[4,4,4,4,4,3,2,1,1]
Y_list=[4,5,6,7,8,8,8,8,9]
P.S:当我检查 "type of" 打印路径时,它显示为 'instance'。
请帮助我,因为经过大量搜索以实现我的首选输出后我被困在这一点上。
请您赐教。非常感谢!!
您可以使用列表理解。
>>> l = [(4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (3, 8), (2, 8), (1, 8), (1, 9)]
>>> la = [x for x,y in l]
>>> lb = [y for x,y in l]
>>> la
[4, 4, 4, 4, 4, 3, 2, 1, 1]
>>> lb
[4, 5, 6, 7, 8, 8, 8, 8, 9]
您可以将元组转置并映射到列表或使用映射和 itemgetter。
from operator import itemgetter
l = [(4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (3, 8), (2, 8), (1, 8), (1, 9)]
a,b = map(itemgetter(0),l), map(itemgetter(1),l)
print(a,b)
a,b = map(list,zip(*l))
print(a,b)
[4, 4, 4, 4, 4, 3, 2, 1, 1] [4, 5, 6, 7, 8, 8, 8, 8, 9]
[4, 4, 4, 4, 4, 3, 2, 1, 1] [4, 5, 6, 7, 8, 8, 8, 8, 9]
您需要在 class 中添加 iter
以便迭代对象:
def __iter__(self):
return iter(self.coords)
class Node():
def __init__(self, pos):
self.pos = pos
def __iter__(self):
return iter(self.pos)
l = []
for x in [(1, 5), (2, 6), (3, 7), (4, 8)]:
l.append(Node(x))
print("{}".format(list(map(list,zip(*l)))))
[[1, 2, 3, 4], [5, 6, 7, 8]]
对于 bfs
使用 Queue 将是一个有效的解决方案:
在下面的函数中,'graph'是一个由1、0和一个'two'(分别是障碍物、空地和目标)组成的二维网格列表,'start'是指向开始搜索。
def bfs(图,开始):
fringe = [[start]]
# Special case: start == goal
if start.val == 'g':
return [start]
start.visited = True
# Calculate width and height dynamically. We assume that "graph" is dense.
width = len(graph[0])
height = len(graph)
# List of possible moves: up, down, left, right.
moves = [(-1, 0), (1, 0), (0, -1), (0, 1)]
while fringe:
# Get first path from fringe and extend it by possible moves.
path = fringe.pop(0)
#print path
node = path[-1]
pos = node.pos
# Using moves list (without all those if's with +1, -1 etc.) has huge benefit:
# moving logic is not duplicated. It will save you from many silly errors.
for move in moves:
# Check out of bounds. Note that it's the ONLY place where we check it.
if not (0 <= pos[0] + move[0] < height and 0 <= pos[1] + move[1] < width):
continue
neighbor = graph[pos[0] + move[0]][pos[1] + move[1]]
if neighbor.val == 'g':
return path + [neighbor]
elif neighbor.val == 'o' and not neighbor.visited:
neighbor.visited = True
fringe.append(path + [neighbor]) # creates copy of list
raise Exception('Path not found!')
TRANSLATE = {0: 'o', 1: 'x', 2: 'g'}
graph = [[Node(TRANSLATE[x], (i, j)) for j, x in enumerate(row)] for i, row in enumerate(graph)]
# Find path
path = bfs(graph, graph[4][4])
当我打印 path 的值时,得到以下内容:
Path [(4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (3, 8), (2, 8), (1, 8), (1, 9)]
这些是 x 和 y 坐标。
现在如何获取坐标作为单独的 'x' 和 'y' 坐标的列表?
我的首选输出是
X_list=[4,4,4,4,4,3,2,1,1]
Y_list=[4,5,6,7,8,8,8,8,9]
P.S:当我检查 "type of" 打印路径时,它显示为 'instance'。
请帮助我,因为经过大量搜索以实现我的首选输出后我被困在这一点上。
请您赐教。非常感谢!!
您可以使用列表理解。
>>> l = [(4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (3, 8), (2, 8), (1, 8), (1, 9)]
>>> la = [x for x,y in l]
>>> lb = [y for x,y in l]
>>> la
[4, 4, 4, 4, 4, 3, 2, 1, 1]
>>> lb
[4, 5, 6, 7, 8, 8, 8, 8, 9]
您可以将元组转置并映射到列表或使用映射和 itemgetter。
from operator import itemgetter
l = [(4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (3, 8), (2, 8), (1, 8), (1, 9)]
a,b = map(itemgetter(0),l), map(itemgetter(1),l)
print(a,b)
a,b = map(list,zip(*l))
print(a,b)
[4, 4, 4, 4, 4, 3, 2, 1, 1] [4, 5, 6, 7, 8, 8, 8, 8, 9]
[4, 4, 4, 4, 4, 3, 2, 1, 1] [4, 5, 6, 7, 8, 8, 8, 8, 9]
您需要在 class 中添加 iter
以便迭代对象:
def __iter__(self):
return iter(self.coords)
class Node():
def __init__(self, pos):
self.pos = pos
def __iter__(self):
return iter(self.pos)
l = []
for x in [(1, 5), (2, 6), (3, 7), (4, 8)]:
l.append(Node(x))
print("{}".format(list(map(list,zip(*l)))))
[[1, 2, 3, 4], [5, 6, 7, 8]]
对于 bfs
使用 Queue 将是一个有效的解决方案: