2012-10-31 14 views
18

W pythonie nie ma typu tablicy, ale aby emulować, możemy użyć list. Chcę mieć strukturę tablicową 2d wypełnioną zerami. Moje pytanie brzmi: jaka jest różnica, jeśli w ogóle, w tym dwóch wyrażeń:2d tablica zer

zeros = [[0 for i in xrange(M)] for j in xrange(M)] 

i

zeros = [[0]*M]*N 

Will zeros być takie same? który z nich lepiej jest wykorzystać za pomocą szybkości i czytelności?

Odpowiedz

28

Powinieneś użyć numpy.zeros. Jeśli to nie jest opcja, chcesz pierwszą wersję. W drugiej wersji, jeśli zmienisz jedną wartość, zostanie on zmieniony w innym miejscu listy - np

>>> a = [[0]*10]*10 
>>> a 
[[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, 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], [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, 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]] 
>>> a[0][0] = 1 
>>> a 
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

To dlatego (jak można przeczytać na ekspresję od wewnątrz), należy utworzyć listę 10 zer. Następnie utworzysz listę 10 odnośników do tej początkowej listy 10 zer.


zauważyć, że:

zeros = [ [0]*M for _ in xrange(N) ] 

będzie również pracować i unika zagnieżdżony listowych. Jeśli numpy nie ma na stole, jest to forma, której użyłbym.

+0

Czy to naprawdę konieczne stosowanie numpy prostu dla tej jednej funkcji? +1 dla pierwszej wersji. – John

+1

@johnthexiii - Prawdopodobnie nie. Ale jeśli OP chce mieć tablicę zerową o liczbie 2d, byłbym gotów wyjść z założenia i powiedzieć, że kod OP mógłby prawdopodobnie korzystać z numpy również w innych miejscach. – mgilson

+0

Nie zainstaluję numpy tylko dla zerowania listy;) Dzięki za późniejsze wyjaśnienie, to było to, czego szukałem. – yakxxx

2

W drugim przypadku tworzy się listę odniesień do tej samej listy. Jeśli masz kod taki jak: [lst] * N gdzie lst jest odniesieniem do listy, będziesz mieć następującą listę: [lst, lst, lst, lst, ..., lst]. Ponieważ jednak lista wyników zawiera odniesienie do tego samego obiektu, zmiana wartości w jednym wierszu zostanie zmieniona we wszystkich pozostałych wierszach.

7

dla Pythona 3 (nie więcej funkcji xrange), korzystna odpowiedź

zeros = [ [0] * N for _ in range(M)] 

dla M x N macierzy zer