我使用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。
您的代码有两个简单的优化:
-
用
xrange
代替range
。这将防止生成两个临时列表。 -
在
xrange
的参数中使用min
和max
,以省略外环中的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