剪切二维列表直到内容形成矩形(Python)

剪切二维列表直到内容形成矩形(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

在我必须制作的关卡编辑器中,我需要获取一个包含大量空白(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 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)])