Seite 1 von 1

Mehrdimensionale Felder in Python???

Verfasst: Sonntag 2. Januar 2005, 13:22
von Gast
Hi. Ich suche eine Möglichkeit ein mehrdimensionales Feld(z.B. Feld[2][3] (C++)) zu erstellen. Bei allen bisherigen Versuchen bekam ich nur eindimensionale Felder heraus.

Verfasst: Sonntag 2. Januar 2005, 14:13
von Dookie
Hi gast,

Code: Alles auswählen

feld = [[[ 1,  2,  3], [ 4,  5,  6], [ 7 ,  8,   9]],
        [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
        [[19, 20, 21], [22, 23, 24], [25, 26, 27]]]

print feld[2][1][0]
Oder willst du eine vordimensionierte liste mit z.B. None als Elementen, dann gehts am einfachsten über eine kleine Funktion.

Code: Alles auswählen

def ndlist(*args, **kw):
    """ call ndlist(dim0, dim1, dim2, ...[, value=initialvalue]) """
    res = [kw.pop("value", None)]
    for n in args[::-1]:
        res = [res[:]*n]
    return res[0]

l = ndlist(2,3,4)
print l[1][2][1]

Gruß

Dookie

Verfasst: Sonntag 2. Januar 2005, 23:14
von Johi
muss das net heißen:

Code: Alles auswählen

    for n in args[::-1]:
und

Code: Alles auswählen

l = ndlist(None,2,3,4)
?
ich bin noch relativ neu in python, deswegen bin ich mir nicht sicher.

Verfasst: Montag 3. Januar 2005, 00:21
von Dookie
Hi Johi,

stimmt, habs wohl zu schnell getippt :oops:
Hab ndlist jetzt korrigiert.


Gruß

Dookie

Verfasst: Montag 3. Januar 2005, 11:25
von Johi
eine Frage hätte ich aber noch:
Offensichtlich bewirkt [::-1], dass die Liste umgedreht wird.
Aber warum benutzt man nicht .reverse()?
Ist Slicing schneller, oder benutzt man es in diesem Fall nur, weil .reverse() keinen Wert zurückliefert und das alles Umständlicher machen würde?
Und Wie kommt man auf [::-1]?
Gibts irgendwo ne Liste, wo solche Tricks stehen, oder wissen das nur die ganz schlauen? :D

Verfasst: Montag 3. Januar 2005, 11:51
von mawe
Hi!
Johi hat geschrieben: oder wissen das nur die ganz schlauen?
Nein, ich weiß es auch :D

[::-1] bewirkt nicht daß die List umgedreht wird, sie wird nur von hinten nach vorne abgearbeitet. Mit .reverse() wird sie tatsächlich umgedreht.
Seit Python 2.4 kann man auch reversed() verwenden:

Code: Alles auswählen

x = [1,2,3]
for i in reversed(x):
    print i,    # -> 3 2 1
Gruß, mawe

Verfasst: Montag 3. Januar 2005, 13:16
von Gast
Wie geht das wenn man die Liste nicht selbst erstellen möchte, sondern eine fertige liste mit Werten füllt. Mein Problem ist, dass ich nicht weiß wie ich eine leere Liste erzeuge, in die ich hinterher Daten schreiben will. mir würde schon reichen wenn ich ALLE werte auf 0 bekomme ohne jeden einzelnen Wert Niederzutippen ;)



Das ist mir zu umständlich und bläht meinen Code sehr auf da ich eine 3 Demensionale Liste brauche ( C++Array[100][100][100] ) :

Code: Alles auswählen

feld = [[[ 1,  2,  3], [ 4,  5,  6], [ 7 ,  8,   9]], 
        [[10, 11, 12], [13, 14, 15], [16, 17, 18]], 
        [[19, 20, 21], [22, 23, 24], [25, 26, 27]]] 

print feld[2][1][0] 
Ich möchte eher so etwas haben :

Code: Alles auswählen

Mein3DArray[100][100][100] = 0 # WIE GEHT SOETWAS ????

Mein3DArray[12][43][22] = 1

print Mein3DArray[12][43][22] 
Wie erstelle ich nun ein Leeres Mehrdemensionales Feld ?? Eine Demension bekomme ich ja hin mit :

LeereListe = []

nur Mehrdemensional geht net :(

LeereListe = [][][] ?? geht nicht
LeereListe = [],[],[] ?? geht auchnet

Ich hoffe ihr versteht was ich meine ;)

Verfasst: Montag 3. Januar 2005, 13:47
von Dookie
das mit der dreidimensionalen liste geht so:

Code: Alles auswählen

leere_liste = [[[]]]
Falls es sich um Numerische Werte handelt, solltest Du dir auch das Modul numarray anschauen.
Hier findest Du die Dokumentation.


Gruß

Dookie

Verfasst: Mittwoch 5. Januar 2005, 14:44
von Gast
Danke, das hat mir sehr geholfen.

Verfasst: Donnerstag 6. Januar 2005, 08:55
von Gast
Dookie hat geschrieben:das mit der dreidimensionalen liste geht so:

Code: Alles auswählen

leere_liste = [[[]]]
Dookie
Ja danke, das ist schonmal gut zu wissen. Wie kann ich dem dreidimensionalen Array nun sagen, das es 100x100x100 Werte enthalten soll die Alle NULL ( 0 ) sind ?

Verfasst: Donnerstag 6. Januar 2005, 10:05
von rayo
Hi

mit Dookies Funktion:

Code: Alles auswählen

array = ndlist(100,100,100)
Gruss

Verfasst: Donnerstag 6. Januar 2005, 10:26
von Gast
JUHU :D es geht :D *freu* ...