2016-11-09 11 views
3

ich eine Funktion erstellen versuche, die die leeren Slots in dieser Liste zurückgibt:Python: Leere Räume (die mit 0'en) in Listen

grid = [[0,0,0,4],[0,0,4,2],[2,4,4,2],[0,8,4,2]] 

Die leeren Slots in diesem Fall ist diese Schlitze mit Nullen.

Das war mein Programm für sie:

def empty_slots(): 
    lst = [] 
    for i in grid: 
     for j in grid: 
      if j == 0: 
       lst = lst + [(i,j)] 
    return lst 

Allerdings, wenn ich dieses Programm ausführen ich [] eine leere Liste erhalten. Und die Funktion sollte ausgeben: [(0,0), (0,1), (0,2), (1,0), (1,1), (3,0)]. Hinweis: Ich verwende Python 2.7.

+0

Tipp: Sehen Sie, was 'für i in Raster: print (i)' Drucke. –

+0

@ PM2Ring Es druckt nur, was im Raster ist – Zaruya

+0

Exactly. 'for i in grid:' iteriert über die Elemente in 'grid', es iteriert nicht über ihre Indizes. –

Antwort

1

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. :)

+0

Oh, verstehe ich jetzt, aber gibt es eine Möglichkeit, es ohne die Aufzählungsfunktion zu iterieren? – Zaruya

+0

@Zaruya Sicher. Gib mir eine Minute ... –

+0

Aus dem Blick darauf verstehe ich es deutlicher. Danke – Zaruya

1

In Liste Verständnis:

grid = [[0,0,0,4],[0,0,4,2],[2,4,4,2],[0,8,4,2]] 

[(i,j) for i,b in enumerate(grid) for j,a in enumerate(b) if a==0] 

Out[81]: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (3, 0)] 
+0

Schöne und einfache Einliner. –

+0

Listenkompromittierungen sind eine ungeeignete Antwort für einen neuen Python-Benutzer, der Probleme mit der Iteration hat. –