我正在尝试创建一个返回此列表中空插槽的函数:
grid = [[0,0,0,4],[0,0,4,2],[2,4,4,2],[0,8,4,2]]
在这种情况下,空插槽是带有零的插槽。
这是我的计划:
def empty_slots():
lst = []
for i in grid:
for j in grid:
if j == 0:
lst = lst + [(i,j)]
return lst
但是,当我运行此程序时,我得到一个空列表[]
。该函数应输出:[(0,0), (0,1), (0,2), (1,0), (1,1), (3,0)]
。注意:我使用的是Python 2.7。
答案 0 :(得分:1)
for i in grid:
遍历grid
中的项目,它不会迭代其索引。但是,当您通过内置enumerate
函数迭代迭代项时,可以获取索引:
def empty_slots(grid):
return [(i, j) for i, row in enumerate(grid)
for j, v in enumerate(row) if not v]
grid = [[0,0,0,4],[0,0,4,2],[2,4,4,2],[0,8,4,2]]
print(empty_slots(grid))
<强>输出强>
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (3, 0)]
使用“传统”for
循环而不是列表理解,这是同样的事情。
def empty_slots(grid):
zeros = []
for i, row in enumerate(grid):
for j, v in enumerate(row):
if v == 0:
zeros.append((i, j))
return zeros
在此版本中,我使用v == 0
的显式测试而不是not v
;如果v
是任何“假”值,例如0,或者空字符串,列表,元组,集合或字典,则后者将测试为真。
您不需要 enumerate
来执行此操作。你可以这样做:
def empty_slots(grid):
zeros = []
for i in range(len(grid)):
row = grid[i]
for j in range(len(row)):
if row[j] == 0:
zeros.append((i, j))
return zeros
然而,在迭代中直接迭代项目被认为更Pythonic,所以在实际应用时通常会避免这种情况:
for i in range(len(grid)):
有时你将需要做那种事情,但通常这样的代码是一种更好的方法。 :)
答案 1 :(得分:1)
在列表理解中:
var arr [];