如何摆脱嵌套的for循环

时间:2017-11-23 20:59:02

标签: python python-2.7 for-loop

maze如何在不影响代码功能的情况下替换嵌套的for循环:

def addCoordinate(self, x, y, blockType):
    if self.x1 < x :
        self.x1 = x
    if self.y1 < y:
        self.y1 = y
    if self.x1 >= len(self.mazeboard) or self.y1 >= len(self.mazeboard):
        modified_board = [[1 for a in range(self.x1 + 1)] for b in range(self.y1 + 1)]
        for a in range(len(self.mazeboard)):
            for b in range(len(self.mazeboard[a])):
                modified_board[a][b] = self.mazeboard[a][b]
        self.mazeboard = modified_board
    self.mazeboard[x][y] = blockType

2 个答案:

答案 0 :(得分:1)

是的,嵌套循环&amp; range(len(self.mazeboard))在这里是高度unpythonic,最重要的是你只想扩展像

这样的矩阵
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0 1 1 1
0 0 0 0 0 1 1 1
0 0 0 0 0 1 1 1
0 0 0 0 0 1 1 1
0 0 0 0 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

您可以就地工作,使用一行完成现有行,并添加一行,直到达到正确的维度

自包含的例子:

mazeboard = [[0]*5 for _ in range(5)]
x1 = 7
x2 = 7

old_len = len(mazeboard[0])
# extend the existing rows
for m in mazeboard:
    m += [1]*(x1+1-old_len)
# add rows
mazeboard += [[1]*(x1+1) for i in range(len(mazeboard),x2+1)]

print(mazeboard)

结果:

[[0, 0, 0, 0, 0, 1, 1, 1],
  [0, 0, 0, 0, 0, 1, 1, 1],
  [0, 0, 0, 0, 0, 1, 1, 1],
  [0, 0, 0, 0, 0, 1, 1, 1],
  [0, 0, 0, 0, 0, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1, 1]]

所以没有嵌套循环,没有无用的副本,使用列表乘法生成要添加的列表的正确长度。

答案 1 :(得分:0)

如果您使用Python中的矩阵,您可能需要考虑使用Numpy

你的例子变得微不足道numpy。首先,导入numpy:

>>> import numpy as np

创建5x5矩阵:

>>> a=np.ones(shape=(5,5))
>>> a
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

使用另外5列和5行扩展该矩阵:

>>> a=np.pad(a,((0,5),(0,5)),mode='constant', constant_values=0)
>>> a
array([[ 1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

代替嵌套的Python循环,您将使C代码更快,更高效地执行矩阵函数。