2011-11-24 72 views
2

我使用for循环遍历二维列表:的Python:高效遍历多维列表

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。

回答

4

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

  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 

这将稍微增加性能。

+0

xrange的+1。谢谢! – Sathvik

+0

我听说xrange在Python3中已被弃用。 – Sathvik

+1

@Sathvik:Python3中的'range'的行为与Python2中的'xrange'类似。 'list(range(...))'是Python2中'range'的Python3等价物。因此,* name *'xrange'已经从Python3中移除,但不是行为。 – unutbu

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

'itertools.product'是2.6+。 – Avaris

+0

@Avaris - 真实。 :)那么,第一句话就代表了。 :) – Amber

+2

对:)。此外,也许你可以缩短如果条件为:0 <= i <1H和0 <= j Avaris