我正在使用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做同样的事情。
答案 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)
您的代码有两种简单的优化:
使用xrange
代替range
。这样可以防止生成两个临时列表。
在min
的参数中使用max
和xrange
在外部循环中省略'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
这会略微提高性能。