Jak zdefiniować tablicę dwuwymiarową?

Chcę zdefiniować tablicę dwuwymiarową bez inicjalizowanej długości, tak:

Matrix = [][]
Ale to nie działa...

Próbowałem poniższego kodu, ale też jest źle:

Matrix = [5][5]

błąd:

Traceback ...

IndexError: list index out of range
Jaki jest mój błąd?
Author: martineau, 2011-07-12

27 answers

Technicznie próbujesz zaindeksować niezainicjowaną tablicę. Musisz najpierw zainicjować zewnętrzną listę listami przed dodaniem elementów; Python wywołuje to "rozumienie listy".

# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)] 

Możesz teraz dodawać pozycje do listy:

Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range... 
Matrix[0][6] = 3 # valid

Zauważ, że macierz jest adresem głównym "y", innymi słowy, "indeks y" jest przed "indeksem x".

print Matrix[0][0] # prints 1
x, y = 0, 6 
print Matrix[x][y] # prints 3; be careful with indexing! 

Chociaż możesz je nazwać, jak chcesz, patrzę na to w ten sposób, aby uniknąć nieporozumień, które mogą powstać z indeksowaniem, jeśli używasz "x" zarówno dla list wewnętrznych, jak i zewnętrznych i chcesz mieć macierz nie kwadratową.

 1085
Author: Manny D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-05 19:18:59

Jeśli naprawdę chcesz mieć matrycę, możesz lepiej użyć numpy. Operacje macierzy w numpy najczęściej używają typu tablicy o dwóch wymiarach. Istnieje wiele sposobów tworzenia nowej tablicy; jednym z najbardziej przydatnych jest funkcja zeros, która pobiera parametr kształtu i zwraca tablicę o podanym kształcie, z wartościami zainicjalizowanymi na zero:

>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 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.]])

Oto kilka innych sposobów tworzenia tablic i macierzy 2-d (z wyjściem usuniętym dla zwartości):

numpy.arange(25).reshape((5, 5))         # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5))   # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5))    # pass a Python list and reshape
numpy.empty((5, 5))                      # allocate, but don't initialize
numpy.ones((5, 5))                       # initialize with ones

numpy zapewnia matrix Typ również, ale nie jest już zalecany do jakiegokolwiek użycia i może zostać usunięty z numpy w przyszłości.

 429
Author: senderle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-01 16:33:49

Oto krótsza notacja do inicjalizacji listy list:

matrix = [[0]*5 for i in range(5)]

Niestety skracanie tego do czegoś w rodzaju 5*[5*[0]] tak naprawdę nie działa, ponieważ kończy się na 5 kopiach tej samej listy, więc po zmodyfikowaniu jednej z nich wszystkie się zmieniają, na przykład:

>>> matrix = 5*[5*[0]]
>>> matrix
[[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]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]
 354
Author: Andrew Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 16:17:19

Jeśli chcesz utworzyć pustą macierz, poprawną składnią jest

matrix = [[]]

I jeśli chcesz wygenerować macierz wielkości 5 wypełnioną 0,

matrix = [[0 for i in xrange(5)] for i in xrange(5)]
 120
Author: mripard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 16:00:49

Jeśli potrzebujesz tylko dwuwymiarowego kontenera do przechowywania niektórych elementów, możesz wygodnie użyć słownika:

Matrix = {}

Wtedy możesz zrobić:

Matrix[1,2] = 15
print Matrix[1,2]

To działa, ponieważ 1,2 jest krotką i używasz jej jako klucza do indeksowania słownika. Wynik jest podobny do durnej macierzy rzadkiej.

Jak wskazują osa i Josap Valls, możesz również użyć Matrix = collections.defaultdict(lambda:0), aby brakujące elementy miały domyślną wartość 0.

Vatsal wskazuje dalej, że ta metoda prawdopodobnie nie jest zbyt wydajny dla dużych macierzy i powinien być używany tylko w częściach kodu, które nie mają krytycznego wpływu na wydajność.

 79
Author: enobayram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:22:01

W Pythonie tworzysz listę list. Nie musisz deklarować wymiarów z wyprzedzeniem, ale możesz. Na przykład:

matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)

Teraz macierz[0] [0] = = 2 i macierz[1][0] == 3. Możesz również użyć składni rozumienia listy. Ten przykład używa go dwa razy do zbudowania "dwuwymiarowej listy":

from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]
 46
Author: wberry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 16:04:15
rows = int(input())
cols = int(input())

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

print(matrix)

Dlaczego tak długi Kod, że też w Python pytasz?

Dawno temu, kiedy nie czułem się komfortowo z Pythonem, zobaczyłem odpowiedzi pojedynczej linii do pisania macierzy 2D i powiedziałem sobie, że nie będę ponownie używał macierzy 2-D w Pythonie. (Te pojedyncze linie były dość przerażające i nie dało mi żadnych informacji o tym, co robi Python. Zauważ również, że nie jestem świadomy tych skrótów.)

Tak czy inaczej, oto kod dla początkującego, który pochodzi z C, CPP i Java background

Uwaga dla miłośników i ekspertów Pythona: proszę nie odrzucać głosowania tylko dlatego, że napisałem szczegółowy kod.

 25
Author: unknownerror,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-06 21:06:04

Powinieneś zrobić listę list, a najlepszym sposobem jest użycie zagnieżdżonych składów:

>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(matrix)
[[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]]

W twoim przykładzie [5][5] tworzysz listę z liczbą całkowitą " 5 " w środku i próbujesz uzyskać dostęp do jej piątego elementu, co naturalnie powoduje powstanie IndexError, ponieważ nie ma piątego elementu:

>>> l = [5]
>>> l[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
 24
Author: utdemir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:11:31

Przyjęta odpowiedź jest dobra i poprawna, ale zajęło mi trochę czasu, aby zrozumieć, że mogę również użyć jej do stworzenia całkowicie pustej tablicy.

l =  [[] for _ in range(3)]

Wyniki w

[[], [], []]
 22
Author: Fabian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-04 14:31:20

W ten sposób zwykle tworzę tablice 2D w Pythonie.

col = 3
row = 4
array = [[0] * col for _ in range(row)]

Uważam tę składnię za łatwą do zapamiętania w porównaniu z używaniem dwóch pętli for w zrozumieniu listy.

 15
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-04 11:01:31

Użycie:

matrix = [[0]*5 for i in range(5)]

*5 dla pierwszego wymiaru działa, ponieważ na tym poziomie dane są niezmienne.

 14
Author: innov8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:22:37

Przepisanie dla łatwego czytania:

# 2D array/ matrix

# 5 rows, 5 cols
rows_count = 5
cols_count = 5

# create
#     creation looks reverse
#     create an array of "cols_count" cols, for each of the "rows_count" rows
#        all elements are initialized to 0
two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)]

# index is from 0 to 4
#     for both rows & cols
#     since 5 rows, 5 cols

# use
two_d_array[0][0] = 1
print two_d_array[0][0]  # prints 1   # 1st row, 1st col (top-left element of matrix)

two_d_array[1][0] = 2
print two_d_array[1][0]  # prints 2   # 2nd row, 1st col

two_d_array[1][4] = 3
print two_d_array[1][4]  # prints 3   # 2nd row, last col

two_d_array[4][4] = 4
print two_d_array[4][4]  # prints 4   # last row, last col (right, bottom element of matrix)
 13
Author: Manohar Reddy Poreddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-02 11:41:54

Aby zadeklarować macierz zer (jedynek):

numpy.zeros((x, y))

Np.

>>> numpy.zeros((3, 5))
    array([[ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.]])

Lub numpy.ones ((x, y)) np.

>>> np.ones((3, 5))
array([[ 1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.]])

Możliwe są nawet trzy wymiary. ( http://www.astro.ufl.edu / ~warner/prog/python.html Zobacz -- > tablice wielowymiarowe)

 12
Author: khaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-07 20:45:17

Jestem na moim pierwszym skrypcie Pythona i byłem trochę zdezorientowany przez przykład macierzy kwadratowej, więc mam nadzieję, że poniższy przykład pomoże Ci zaoszczędzić trochę czasu:

 # Creates a 2 x 5 matrix
 Matrix = [[0 for y in xrange(5)] for x in xrange(2)]

Tak, że

Matrix[1][4] = 2 # Valid
Matrix[4][1] = 3 # IndexError: list index out of range
 11
Author: user110954,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:20:45

Używając NumPy możesz zainicjalizować pustą macierz w następujący sposób:

import numpy as np
mm = np.matrix([])

I Później Dołącz dane w ten sposób:

mm = np.append(mm, [[1,2]], axis=1)
 10
Author: Namrata Tolani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:26:49

Właśnie do tego stworzony jest słownik!

matrix = {}

Możesz zdefiniować klucze i wartości na dwa sposoby:

matrix[0,0] = value

Lub

matrix = { (0,0)  : value }

Wynik:

   [ value,  value,  value,  value,  value],
   [ value,  value,  value,  value,  value],
   ...
 8
Author: Mohammad Mahdi KouchakYazdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Czytam w plikach rozdzielonych przecinkami w ten sposób:

data=[]
for l in infile:
    l = split(',')
    data.append(l)

Lista "data" jest wtedy listą list z danymi indeksu[row] [col]

 7
Author: wsanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 19:40:26

Jeśli chcesz być w stanie myśleć to jako tablica 2D, a nie być zmuszonym do myślenia w kategoriach listy list (dużo bardziej naturalne moim zdaniem), możesz zrobić co następuje:

import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()

Wynikiem jest lista (nie tablica NumPy), i można nadpisać poszczególne pozycje liczbami, łańcuchami, cokolwiek.

 7
Author: alessadnro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:24:47

Użycie:

import copy

def ndlist(*args, init=0):
    dp = init
    for x in reversed(args):
        dp = [copy.deepcopy(dp) for _ in range(x)]
    return dp

l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's
l[0][1][2][3] = 1
Myślę, że NumPy jest najlepszą drogą. Powyższe jest ogólne, jeśli nie chcesz używać NumPy.
 6
Author: pterodragon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:23:32

Możesz utworzyć pustą dwuwymiarową listę poprzez zagnieżdżenie dwóch lub więcej kwadratowych usztywnień lub trzeciego nawiasu ([], oddzielonych przecinkiem) z kwadratowym usztywnieniem, tak jak poniżej:

Matrix = [[], []]

Teraz Załóżmy, że chcesz dodać 1 do Matrix[0][0] wtedy wpisz:

Matrix[0].append(1)

Teraz, wpisz Matrix i naciśnij Enter. Wyjście będzie:

[[1], []]

Jeśli zamiast

Matrix[1].append(1)

Wtedy macierz będzie

[[], [1]]
 6
Author: Meraj al Maksud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-14 02:54:01
# Creates a list containing 5 lists initialized to 0
Matrix = [[0]*5]*5

Uważaj na to krótkie wyrażenie, zobacz pełne wyjaśnienie w odpowiedzi @F. j

 4
Author: 和風信使,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 19:58:32

Używając listy:

matrix_in_python  = [['Roy',80,75,85,90,95],['John',75,80,75,85,100],['Dave',80,80,80,90,95]]

Używając dict: możesz również przechowywać te informacje w tabeli skrótów, aby szybko wyszukiwać, np.

matrix = { '1':[0,0] , '2':[0,1],'3':[0,2],'4' : [1,0],'5':[1,1],'6':[1,2],'7':[2,0],'8':[2,1],'9':[2,2]};

Macierz ['1'] da wynik w czasie O(1)

*uwaga: musisz poradzić sobie z kolizją w tabeli hash

 4
Author: Saurabh Chandra Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-05 05:10:06

Jeśli nie masz informacji o rozmiarze przed rozpoczęciem, utwórz dwie jednowymiarowe listy.

list 1: To store rows
list 2: Actual two-dimensional matrix

Zapisz cały wiersz na pierwszej liście. Po zakończeniu Dodaj listę 1 do listy 2:

from random import randint

coordinates=[]
temp=[]
points=int(raw_input("Enter No Of Coordinates >"))
for i in range(0,points):
    randomx=randint(0,1000)
    randomy=randint(0,1000)
    temp=[]
    temp.append(randomx)
    temp.append(randomy)
    coordinates.append(temp)

print coordinates

Wyjście:

Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]
 4
Author: Nagendra Nigade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-03 20:23:21
l=[[0]*(L) for _ in range(W)]

Będzie szybszy niż:

l = [[0 for x in range(L)] for y in range(W)] 
 4
Author: Harsh Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-07 07:10:06

Oto fragment kodu do tworzenia macierzy w Pythonie:

# get the input rows and cols
rows = int(input("rows : "))
cols = int(input("Cols : "))

# initialize the list
l=[[0]*cols for i in range(rows)]

# fill some random values in it
for i in range(0,rows):
    for j in range(0,cols):
        l[i][j] = i+j

# print the list
for i in range(0,rows):
    print()
    for j in range(0,cols):
        print(l[i][j],end=" ")

Proszę zasugerować, jeśli coś przeoczyłem.

 2
Author: Chandra Shekhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-09 12:54:17

Spróbuj tego:

rows = int(input('Enter rows\n'))
my_list = []
for i in range(rows):
    my_list.append(list(map(int, input().split())))
 1
Author: Ankit Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-28 08:45:03

W przypadku, gdy potrzebujesz macierzy z predefiniowanymi liczbami, możesz użyć następującego kodu:

def matrix(rows, cols, start=0):
    return [[c + start + r * cols for c in range(cols)] for r in range(rows)]


assert matrix(2, 3, 1) == [[1, 2, 3], [4, 5, 6]]
 1
Author: Vlad Bezden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-21 17:15:47