2011-11-24 380 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