嵌套循环只循环一次



我正在尝试为游戏板创建一个掩码。CCD_ 1总是与CCD_。如果掩码为False,则显示"_",而不是显示当前状态。

mask = [[False, True, False, False],[False, False, False, False]]
revealed = [['.', '3', '1', ' '],['.', '.', '1', ' ']]
def hide(revealed):
for i, outer in enumerate(mask):
for j, inner in enumerate(outer): 
if inner == False: 
revealed[i][j] = '_'
return revealed
print(hide(revealed))

预期:

[['_', '3', '1', '_'], ['_', '_', '1', '_']]

得到:

[['_', '3', '1', ' '], ['.', '.', '1', ' ']]

return关键字用于标记函数的结束。由于return在循环中,它在退出函数之前只迭代了一次。

mask = [[False, True, False, False],[False, False, False, False]]
revealed = [['.', '3', '1', ' '],['.', '.', '1', ' ']]
def hide(revealed):
for i, outer in enumerate(mask):
for j, inner in enumerate(outer): 
if inner == False: 
revealed[i][j] = '_'
return revealed
print(hide(revealed))

如果您对numpy满意,这里有一个紧凑的解决方案:

import numpy as np
mask = [[False, True, False, False],[False, False, False, False]]
revealed = [['.', '3', '1', ' '],['.', '.', '1', ' ']]
nmask = np.array(mask)
nrevealed = np.array(revealed)
hidden = np.full_like(nrevealed, '_')
hidden[nmask] = nrevealed[nmask]
# hidden is now:
#  array([['_', '3', '_', '_'],
#         ['_', '_', '_', '_']], dtype='<U1')
if inner == False: 
revealed[i][j] = '_'
return revealed

在第一次将显示的变量求值为true后返回该变量,因此不会检查数组中的所有项。将return语句移出两个循环,这样它就可以在数组中的所有项中进行迭代。

最新更新