for i in grid:
iteriert über die Elemente in grid
, es iteriert nicht über ihre Indizes. Sie können jedoch die Indizes erhalten, wie Sie über die Elemente eines iterable über die eingebaute in enumerate
Funktion iterieren:
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))
Ausgang
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (3, 0)]
Hier ist die gleiche Sache „traditionellen“ mit for
Schleifen anstelle eines Listenverständnisses.
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
In dieser Version verwende ich den expliziten Test von v == 0
statt not v
; Letzteres wird true prüfen, wenn v
irgendein falscher Wert ist, zB 0, oder eine leere Zeichenkette, Liste, Tupel, Satz oder Diktat.
Sie nicht brauchenenumerate
dies zu tun. Sie könnte dies tun:
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
Es wird jedoch mehr Pythonic als direkt über die Elemente in einem iterable iterieren, so dass diese Art der Sache ist in der Regel vermieden werden, wenn praktisch:
for i in range(len(grid)):
Gelegentlich Sie werden müssen diese Art von Sache zu tun, aber in der Regel Code wie das ist ein Symptom, dass es einen besseren Weg, es zu tun ist. :)
Tipp: Sehen Sie, was 'für i in Raster: print (i)' Drucke. –
@ PM2Ring Es druckt nur, was im Raster ist – Zaruya
Exactly. 'for i in grid:' iteriert über die Elemente in 'grid', es iteriert nicht über ihre Indizes. –