这里的目标是获取一些坐标列表,例如[[1,2],[3,4],[7,1]]
,然后确定如果要打印所有这些坐标,画布应该有多大。取最大左下角坐标和最小右上角坐标,使画布紧贴这些点。例如,在上面的列表中,我们正在寻找[[1,1],[7,4]]
,它定义了所有这些点都适合的最小矩形。
在这个功能的中间,我看到传入的“板”分配了一个新值。
def print_board(board):
# import pdb; pdb.set_trace()
dimensions = None
for i in board:
if dimensions == None:
dimensions = [i, i]
else:
dimensions[0][0] = min(dimensions[0][0], i[0])
#'board' is redefined !!!
dimensions[0][1] = min(dimensions[0][1], i[1])
#dimensions[1][0] = max(dimensions[1][0], i[0])
#dimensions[1][1] = max(dimensions[1][1], i[1])
# (after we get the canvas size
# we print the canvas with the points on it
# but we never make it that far without an error)
当for循环移过传入board
中的坐标时,它似乎将board[0]
设置为当时正在查看的任何坐标。因此,[[1,2],[3,4],[7,1]]
将首先更改为[[3,4],[3,4],[7,1]]
,然后更改为[[7,1],[3,4],[7,1]]
。
我不希望board
完全改变。
(Python 3.2.2)
答案 0 :(得分:3)
当你这样做时
dimensions = [i, i]
您将dimensions
中的两个项目都设置为您的主板中的第一个点 - 而不是复制该点。
然后当你做
dimensions[0][0] = min(dimensions[0][0], i[0])
dimensions[0][1] = min(dimensions[0][1], i[1])
你正在更新同一点 - 你的董事会的第一点 - 到min
函数的结果。
尝试这样的事情,而不是:
def print_board(board):
xs, ys = zip(*board) # separate out the x and y coordinates
min_x, max_x = min(xs), max(xs) # find the mins and maxs
min_y, max_y = min(ys), max(ys)
dimensions = [[min_x, min_y], [max_x, max_y]] # make the dimensions array
答案 1 :(得分:0)
作为agfs答案的扩展,您可以使用numpy来获得更高效和简洁的代码:
import numpy as np
def print_board(board):
a = np.array(board)
return [a.min(axis=0).tolist(), a.max(axis=0).tolist()]
如果您的主板已经是一个numpy数组,并且让该函数返回一个numpy数组的元组,它会缩短甚至更多:
def print_board(board):
return board.min(axis=0), board.max(axis=0)