398 Stimmen

Wie initialisiert man ein zweidimensionales Array in Python?

Ich fange mit Python an und ich versuche, eine zweidimensionale Liste zu verwenden, die ich anfangs an jeder Stelle mit derselben Variablen fülle. Ich bin auf Folgendes gekommen:

def initialize_twodlist(foo):
    twod_list = []
    new = []
    for i in range (0, 10):
        for j in range (0, 10):
            new.append(foo)
        twod_list.append(new)
        new = []

Es liefert das gewünschte Ergebnis, fühlt sich aber wie ein Workaround an. Gibt es einen einfacheren/kürzeren/eleganteren Weg, dies zu tun?

39voto

[[foo für x in xrange(10)] für y in xrange(10)]

25voto

Mike Graham Punkte 68846

Normalerweise, wenn Sie mehrdimensionale Arrays möchten, möchten Sie keine Liste von Listen, sondern eher ein numpy-Array oder möglicherweise ein Dictionary.

Zum Beispiel, mit numpy würden Sie etwas wie das Folgende tun

import numpy
a = numpy.empty((10, 10))
a.fill(foo)

25voto

tushar Punkte 371

Für diejenigen, die verwirrt sind, warum [['']*m]*n nicht gut zu verwenden ist.
Grund:- Python verwendet Verweise, daher führt das Ändern eines Werts im obigen Fall auch zum Ändern anderer Indexwerte.

Der beste Weg ist [['' for i in range(m)] for j in range(n)]
Das löst alle Probleme.

Für weitere Klarstellung
Beispiel:

>>> x = [['']*3]*3
[['', '', ''], ['', '', ''], ['', '', '']]
>>> x[0][0] = 1
>>> print(x)
[[1, '', ''], [1, '', ''], [1, '', '']]

>>> y = [['' for i in range(3)] for j in range(3)]
[['', '', ''], ['', '', ''], ['', '', '']]
>>> y[0][0]=1
>>> print(y)
[[1, '', ''], ['', '', ''], ['', '', '']]

11voto

hithwen Punkte 2115

Sie können einfach das tun:

[[Element] * NumCols] * NumRows

Zum Beispiel:

>>> [['a'] *3] * 2
[['a', 'a', 'a'], ['a', 'a', 'a']]

Aber das hat einen unerwünschten Nebeneffekt:

>>> b = [['a']*3]*3
>>> b
[['a', 'a', 'a'], ['a', 'a', 'a'], ['a', 'a', 'a']]
>>> b[1][1]
'a'
>>> b[1][1] = 'b'
>>> b
[['a', 'b', 'a'], ['a', 'b', 'a'], ['a', 'b', 'a']]

11voto

Moustafa Saleh Punkte 178
twod_list = [[foo für _ in range(m)] für _ in range(n)]

für n ist die Anzahl der Zeilen und m ist die Anzahl der Spalten, und foo ist der Wert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X