Python:有效地迭代多维列表

时间:2011-11-24 17:48:21

标签: python loops multidimensional-array

我正在使用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做同样的事情。

2 个答案:

答案 0 :(得分:5)

不是真的。在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

答案 1 :(得分:4)

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

  1. 使用xrange代替range。这样可以防止生成两个临时列表。

  2. min的参数中使用maxxrange在外部循环中省略'if'。所以你的代码看起来像这样:

  3.  
        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
    

    这会略微提高性能。