Próbuję wygenerować pustą dwuwymiarową tablicę przy użyciu pętli for. Znalazłem jedną metodę, która działa i wygląda to tak:

rows = 5
cols = 5
grid1 = []
grid1 = [[0 for i in range(cols)] for j in range(rows)] 
print(grid1)

Wynik:

[[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]]

Jednak gdy próbuję napisać pętle for w „normalnej” składni, generuje błąd. Dlaczego nie mogę napisać tego w normalnej składni?

rows = 5
cols = 5

grid2 = []
for i in range(rows):
    for j in range(cols):
        grid2[i][j] = 0
print(grid2)

Wynik:

Exception has occurred: IndexError
list index out of range
  File "C:\Users\Bruker\Downloads\test.py", line 8, in <module>
    grid2[i][j] = 0
1
Martin Ansteensen 3 kwiecień 2020, 11:36

5 odpowiedzi

Najlepsza odpowiedź

Otrzymujesz IndexError, ponieważ nie możesz przypisać do indeksu na liście poza aktualną długością listy. Ponieważ grid2 jest zainicjowany jako pusta lista, każda próba zindeksowania spowoduje zgłoszenie tego błędu.

Jednym z poprawnych sposobów zapisania zagnieżdżonych list przy użyciu pętli for byłoby skonstruowanie najpierw wewnętrznej listy dla każdego wiersza, a następnie append to do grid2:

grid2 = []
for i in range(rows):
    inner = []
    for j in range(cols):
        inner.append(0)
    grid2.append(inner)
2
dspencer 3 kwiecień 2020, 08:45

W pierwszym przypadku każda komórka istnieje, więc możesz uzyskać do nich dostęp według indeksu, ale w drugim przypadku nie istnieją, w drugim przypadku

grid2 = []
for i in range(rows):
    tmp = []
    for j in range(cols):
        tmp.append(0)
    grid2.append(tmp)

W rzeczywistości, jeśli zredukujesz ten kod, gdy masz następujące elementy, i ponownie zredukujesz z innym zrozumieniem listy, masz swój pierwszy kod

grid2 = []
for i in range(rows):
    grid2.append([0 for j in range(cols)])
0
azro 3 kwiecień 2020, 08:39

Próbujesz uzyskać dostęp do drugiego „wymiaru” lub wewnętrznej pętli bez tworzenia tutaj, możesz użyć:

rows = 5
cols = 5

grid2 = []
for _ in range(rows):
    grid2.append([])
    for _ in range(cols):
        grid2[-1].append(0)
print(grid2)

Lub możesz użyć:

grid2 = []
for _ in range(rows):
    grid2.append([0] * cols)
0
kederrac 3 kwiecień 2020, 08:42

Musisz użyć funkcji .append(), aby dodać elementy do listy.

grid2 = []
for i in range(rows):
    grid2.append([])
    for j in range(cols):
        grid2[i].append(0)
print(grid2)

Wydajniej:

grid2 = [[0]*cols] * rows
0
Ben Woo 3 kwiecień 2020, 08:42

Powinieneś zainicjować grid2 = np.empty ([wiersze, kolumny]) zamiast tego zapoznaj się z https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html#numpy.empty po więcej szczegółów

0
yuri 3 kwiecień 2020, 08:45