Python:有效地迭代一个多维列表



我使用for循环遍历二维列表:

def itr(lpic, lH, lW, x, y):
    '''lpic=2D-Array; lH=Row_count; lW=Column_count;'''
    stack = []
    range_x = range(x-1, x+2)
    range_y = range(y-1, y+2)
    append = stack.append
    for i in range_x:
                if 0<=i<lH:#i is a valid index *Updated
                    for j in range_y:
                        if (0<=j<lW) and (lpic[i][j]=="0"):
                            lpic[i][j] = "1"
                            append([i, j])
    return stack

我想知道是否有更好的方法来做同样的Python2.5。

您的代码有两个简单的优化:

  1. xrange代替range。这将防止生成两个临时列表。

  2. xrange的参数中使用minmax,以省略外环中的if。所以你的代码看起来像这样:

def itr(lpic, lH, lW, x, y):
    '''lpic=2D-Array; lH=Row_count; lW=Column_count;'''
    stack = []
    range_x = xrange(max(0,x-1), min(lH,x+2))
    range_y = xrange(max(0,y-1), min(lW,y+2))
    append = stack.append
    for i in range_x:
      for j in range_y:
          if lpic[i][j]=="0":
              lpic[i][j] = "1"
              append([i, j])
    return stack

这将略微提高性能。

不完全是。在Python 2.6中,如果你想压缩你的代码,你可以使用itertools.product()把它变成一个单独的for循环,但一般的效率不会改变——你仍然有N*M循环迭代。

import itertools
def itr(lpic, lH, lW, x, y):
    '''lpic=2D-Array; lH=Row_count; lW=Column_count;'''
    stack = []
    range_x = range(x-1, x+2)
    range_y = range(y-1, y+2)
    append = stack.append
    for i,j in itertools.product(range_x, range_y):
        if 0 <= i < lh and 0 <= j < lW and lpic[i][j]=="0":
            lpic[i][j] = "1"
            append([i, j])
    return stack

相关内容

  • 没有找到相关文章