迭代在python中的2D列表(矩阵)的范围内

时间:2014-04-19 06:59:41

标签: python

我想迭代2D列表。我知道我可以这样做:

for j in range(columns):
     for i in range(rows):
        print depth[i][j],

但是有更美好的方式吗?我试过了:

for (x in range(rows)) and (y in range(columns)):
     print(depth[x][y])

但这给了我一个IndentationError。:

由于

修改     如果我想为x和y设置边界怎么办?假设我有一个4x4矩阵(使用列表来表示它)。对于给定的元素,我想在它周围得到3x3矩阵,但我想保持在原始矩阵的范围内。假设我在(3,1),取x = range(3-2, 3+3) = [1,2,3,4,5]y = range(1-2,1+3) = [-1, 0, 1, 2, 3]会使我超出原始矩阵的范围。

2 个答案:

答案 0 :(得分:3)

您可以使用itertools.product,或编写双循环生成器表达式,如:

for (i,j) in ( (i,j) for i in range(rows) for j in range(columns) ):
    print depth[i][j]

for d in ( depth[i][j] for i in range(rows) for j in range(columns) ): ...

另外,如果您实际上并不需要索引,而只是迭代depth,您可以这样做:

for row in depth:
   for v in row:
      print

即使你确实需要索引,使用enumerate也更加pythonic:

for row_index, row in enumerate(depth):
   for col_index, v in enumerate(row):
      print 'depth[%d][%d]=%s' % (row_index, col_index, v)

答案 1 :(得分:2)

这可以通过以下方式完成:

for depth in (depth[x][y] for x in range(rows) for y in range(columns)):
    print depth

编辑:

如果你想要边界,你可以使用minmax内置:

for x in range( max(x_min,col-2), min(x_max,col+3) ):
    #do stuff