剪切二维列表直到内容形成矩形(Python)
在我必须制作的关卡编辑器中,我需要获取一个包含大量空白(0)的2d列表,并将其剪辑并添加到其中,直到外部没有0,内部正常为止。我需要做的第一件事是剪掉每一边多余的0 例: 请注意,我只是使用1和0,在编辑器中有许多不同的块,在本例中为1 编辑: 我试过这个,但它真的有问题:剪切二维列表直到内容形成矩形(Python),python,arrays,list,Python,Arrays,List,在我必须制作的关卡编辑器中,我需要获取一个包含大量空白(0)的2d列表,并将其剪辑并添加到其中,直到外部没有0,内部正常为止。我需要做的第一件事是剪掉每一边多余的0 例: 请注意,我只是使用1和0,在编辑器中有许多不同的块,在本例中为1 编辑: 我试过这个,但它真的有问题: def clipMap(map): minX = 0 minY = 0 maxX = len(map[0]) maxY = len(map) #Find min and max for y in
def clipMap(map):
minX = 0
minY = 0
maxX = len(map[0])
maxY = len(map)
#Find min and max
for y in map:
for x in map[y]:
if map[y][x] != 0:
if x < minX:
minX = x
else if x > maxX:
maxX = x
if y < minY:
minY = y
else if y > maxY:
maxY = y
#remove them
X = slice(minX, maxX)
Y = slice(minY, maxY)
map = map[Y]
for y in map:
map[y] = map[y][X]
return map
def clipMap(映射):
minX=0
minY=0
maxX=len(映射[0])
maxY=len(映射)
#查找最小值和最大值
对于地图中的y:
对于地图[y]中的x:
如果映射[y][x]!=0:
如果xmaxX:
maxX=x
如果ymaxY:
maxY=y
#移除它们
X=切片(最小、最大)
Y=切片(最小、最大)
map=map[Y]
对于地图中的y:
map[y]=map[y][X]
返回图
原始版本可能是:
def truthy_idx(it):
return next(i for i, x in enumerate(it) if x)
res = [x[truthy_idx(x):len(x)-truthy_idx(x[::-1])] for x in map if any(x)]
这将选择至少包含一个非零值的所有行,并通过其左、右非零值元素修剪每个选定行。我使用一个函数truthy_idx
获取iterable中的第一个非零(truthy)索引,以及一个切片来反转列表,并使用len(row)-truthy_idx(row[:-1])获取最后一个索引。
这不适用于具有锯齿边的网格,但它适用于矩形情况,这里就是这种情况
另外,调用变量map
会覆盖内置函数
如果可以使用numpy,另一种方法是:
np.apply_along_axis(np.trim_zeros, 1, a[a.any(1)])
@是的,我试着在x和y上取最大值和最小值,其中有一些不是0,但它真的有问题,我很难去掉0s@ggorlen应该更新了Wesome,谢谢。锯齿状网格是预期的还是保证是矩形的?应该是矩形的,谢谢澄清。我发布了一个矩形的答案。但是请记住,在编辑器中,除了1之外,还有很多不同的块不是0,这也适用吗?更新。这就是你需要的吗?也谢谢你关于地图的提示,我下意识地这么做了,所以谢谢你的引导。没问题,我的编辑突出了它,这是一个常见的错误。出于好奇,你在使用PyCharm吗?
np.apply_along_axis(np.trim_zeros, 1, a[a.any(1)])