Mehrdimensionale Felder in Python???

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Gast

Mehrdimensionale Felder in Python???

Beitragvon Gast » Sonntag 2. Januar 2005, 13:22

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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Sonntag 2. Januar 2005, 14:13

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
Zuletzt geändert von Dookie am Montag 3. Januar 2005, 00:19, insgesamt 1-mal geändert.

Code: Alles auswählen

#!/usr/bin/env python
import this
Johi
User
Beiträge: 22
Registriert: Sonntag 21. November 2004, 20:08

Beitragvon Johi » Sonntag 2. Januar 2005, 23:14

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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 3. Januar 2005, 00:21

Hi Johi,

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


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Johi
User
Beiträge: 22
Registriert: Sonntag 21. November 2004, 20:08

Beitragvon Johi » Montag 3. Januar 2005, 11:25

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Montag 3. Januar 2005, 11:51

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
Gast

Beitragvon Gast » Montag 3. Januar 2005, 13:16

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 ;)
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 3. Januar 2005, 13:47

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

Code: Alles auswählen

#!/usr/bin/env python
import this
Gast

Beitragvon Gast » Mittwoch 5. Januar 2005, 14:44

Danke, das hat mir sehr geholfen.
Gast

Beitragvon Gast » Donnerstag 6. Januar 2005, 08:55

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 ?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Donnerstag 6. Januar 2005, 10:05

Hi

mit Dookies Funktion:

Code: Alles auswählen

array = ndlist(100,100,100)


Gruss
Gast

Beitragvon Gast » Donnerstag 6. Januar 2005, 10:26

JUHU :D es geht :D *freu* ...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder