Array List oder reicht ein Array

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.
Antworten
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

Hallo zusammen

Ich habe folgende Daten:

Uhrzeit
Ziel
Verkehrsmittel

jedes dieser variablen ist eine Liste mit einzelnen Daten wobei alle 3 variablen die gleiche Anzahl an Elementen haben.
Nun möchte ich diese Verknüpfen mit einander - im Sinne von:

Einfacher Fall:
[Verkehrsmittel1, [ Ziel , [Uhrzeit , Uhrzeit,Uhrzeit]]]

Gleiches Verkehrsmittel aber unterschiedliche Ziele:
[Verkehrsmittel1 ,[ Ziel , [Uhrzeit , Uhrzeit,Uhrzeit]],[ Ziel2 , [Uhrzeit , Uhrzeit,Uhrzeit],......]

Nächstes Verkehrsmittel und weitere:
[Verkehrsmittel1 ,[ Ziel , [Uhrzeit , Uhrzeit,Uhrzeit]],[ Ziel2 , [Uhrzeit , Uhrzeit,Uhrzeit],......]
[Verkehrsmittel2 ,[ Ziel , [Uhrzeit , Uhrzeit,Uhrzeit]],[ Ziel2 , [Uhrzeit , Uhrzeit,Uhrzeit],......]
[..]

Der Hintergrund ist, dass ein Verkehrsmittel in einem bestimmten Takt bzw. Uhrzeit fährt und ich diese gerne alle zusammen hängen möchte(Einfacher Fall). Desweiteren kann das gleiche Verkehrsmittel ein anderes Ziel haben(Gleiches Verkehrsmittel aber unterschiedliche Ziele). Und zum Abschluss gibt es dann noch verschiedene Verkehrsmittel(Nächstes Verkehrsmittel und weitere).

Meine Frage nun - wie leg ich diesen Datensatz am sinnvollsten ab(an) in Python? Arraylist (Bezeichnung aus Java)? Arrays?


vielen Dank für jedliche Antworten
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo DerBorsti,

wie Du die Datentruktur anlegst, wird vor allem dadurch bestimmt, wie Du auf die Daten zugreifen willst. Also entweder, so wie Du schon geschrieben hast als Listen von Listen oder als (in-memory) Sqlite-Datenbank, als Dictionaries, etc.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@DerBorsti: noch als Ergänzung: Baue Deine Datenstruktur so auf, dass der Code einfach bleibt. Also lieber eine komplizierte Datenstruktur, als ein komplizierter Code.
BlackJack

Als weitere Ergänzung: Wenn die Datenstruktur komplexer wird, dann sollte man von verschachtelten Grunddatentypen auf eigene Klassen umsteigen.
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

BlackJack hat geschrieben:Als weitere Ergänzung: Wenn die Datenstruktur komplexer wird, dann sollte man von verschachtelten Grunddatentypen auf eigene Klassen umsteigen.
Hey BlackJack
wieder einmal darf ich auf ein Kommentar von dir zählen - vielen dank !
Ich komme ein wenig aus der OOP von java / c++ denoch habe ich mir gedacht bei der großen Datenmenge die ich habe wären Objekte zu erstellen eher quatsch. Bin zu unerfahren in python damit - aber werde ich gleich mal nachschlagen!

kbr hat geschrieben:@DerBorsti: noch als Ergänzung: Baue Deine Datenstruktur so auf, dass der Code einfach bleibt. Also lieber eine komplizierte Datenstruktur, als ein komplizierter Code.
Hey kbr
^,^ klingt gut - nehme ich mir zu Herzen :)
Sirius3 hat geschrieben:Hallo DerBorsti,

wie Du die Datentruktur anlegst, wird vor allem dadurch bestimmt, wie Du auf die Daten zugreifen willst. Also entweder, so wie Du schon geschrieben hast als Listen von Listen oder als (in-memory) Sqlite-Datenbank, als Dictionaries, etc.
Hey Sirius3
Stimmt absolut! Hätte ich vielleicht erwähnen sollen .... Ich möchte später ein Abfahrts Diagramm machen ... X - Achse soll die Uhrzeit sein und dann mit Farben variert Striche ziehen wo bzw. wann ein Verkehrsmittel (typ) abfährt. in-memory und Dictionaries sagt mir spontan nichts aber klasse - da hab ich mal ein wort wonach ich googeln kann.



Vielen dank allen für eure Kommentare
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

DerBorsti hat geschrieben:in-memory und Dictionaries sagt mir spontan nichts aber klasse - da hab ich mal ein wort wonach ich googeln kann.
Dictionaries kommen im offiziellen Tutorial recht früh vor: http://docs.python.org/2/tutorial/datas ... ctionaries.
BlackJack

@DerBorsti: Wenn Dir Dictionary nichts sagt, dann solltest Du vielleicht mal ein Grundlagentutorial durcharbeiten, bevor Du an Deinem konkreten Problem weiterarbeitest. Den Tipp hätte man vielleicht auch schon bei der Ausgangsfrage geben sollen, denn Arrays gibt es auch nicht als Grunddatentyp in Python. Der Sequenzdatentyp ist die Liste. Und der Datentyp `list` in Python entspricht vom Laufzeitverhalten in etwa dem Datentyp `ArrayList` aus Java.

Objekte zu erstellen ist in Python unumgänglich: *Alles* was man an einen Namen binden kann, ist in Python ein Objekt. Es geht also gar nicht ohne das erstellen von Objekten.
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

/me hat geschrieben:
DerBorsti hat geschrieben:in-memory und Dictionaries sagt mir spontan nichts aber klasse - da hab ich mal ein wort wonach ich googeln kann.
Dictionaries kommen im offiziellen Tutorial recht früh vor: http://docs.python.org/2/tutorial/datas ... ctionaries.
Hey /me
ja vielen Dank - habs mir auch gerade angesehen. Das Problem das ich für meinen Fall jedoch an diesem Beispiel sehe, dass Dictionaries nur von einem Key abhänig sind. ( Bitte korregiert mich - habe mir bis jetzt nur das Beispiel unter dem Text angeschaut) Ich hätte aber zwei sogenannte "Key" 1.Verkehrsmittel 2. Ziel

Aber mal sehen vllt muss ich diesen Beitrag auch gleich editieren - ich spiel da mal eben mit rum
BlackJack hat geschrieben:@DerBorsti: Wenn Dir Dictionary nichts sagt, dann solltest Du vielleicht mal ein Grundlagentutorial durcharbeiten, bevor Du an Deinem konkreten Problem weiterarbeitest. Den Tipp hätte man vielleicht auch schon bei der Ausgangsfrage geben sollen, denn Arrays gibt es auch nicht als Grunddatentyp in Python. Der Sequenzdatentyp ist die Liste. Und der Datentyp `list` in Python entspricht vom Laufzeitverhalten in etwa dem Datentyp `ArrayList` aus Java.

Objekte zu erstellen ist in Python unumgänglich: *Alles* was man an einen Namen binden kann, ist in Python ein Objekt. Es geht also gar nicht ohne das erstellen von Objekten.
Okay da magst du sicherlich Recht haben, aber ich zähle zu den Menschen die lieber erstmal am Code rumspielen wenn man grob eine Idee hat ;)
Puh einiges zu lesen aber ich werd es jetzt mal tun

Vielen Dank erneut
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

DerBorsti hat geschrieben:Das Problem das ich für meinen Fall jedoch an diesem Beispiel sehe, dass Dictionaries nur von einem Key abhänig sind. ( Bitte korregiert mich - habe mir bis jetzt nur das Beispiel unter dem Text angeschaut) Ich hätte aber zwei sogenannte "Key" 1.Verkehrsmittel 2. Ziel
Je nach deinem Problem / deiner gewuenschten Abfrageart kannst du entweder die Schluessel kombinieren und `(Verkehrsmittel, Ziel)` (also das 2-Tupel) benutzen oder Dictionaries verschachteln und die Schluessel sequentiell benutzen.
Das ist also kein Hinderungsgrund.

Wenn du etwas mehr ueber die (erwarteten) Zugriffsmuster erzaehlst, koennen wir dir da noch weiterhelfen.
BlackJack

@DerBorsti: Man kann doch aber nicht sinnvoll mit Code herum spielen wenn man die Grundbausteine dafür überhaupt gar nicht kennt‽ Und dazu gehört neben den Schlüsselworten und der Syntax auch alles was man ohne zu importieren benutzen kann.
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

BlackJack hat geschrieben:@DerBorsti: Man kann doch aber nicht sinnvoll mit Code herum spielen wenn man die Grundbausteine dafür überhaupt gar nicht kennt‽ Und dazu gehört neben den Schlüsselworten und der Syntax auch alles was man ohne zu importieren benutzen kann.
:D wo ein wille - dort ein weg :D

so habs gelöst.....
Als Beispiel für eine kommende Generation - so macht man es nicht aber es geht :=)

Code: Alles auswählen

class Verkehrsmittel:
    def __init__(self):
       self.verkehrsmittel=[]
       self.ziel =[]
       self.uhrzeit = []
[..]
gefunden=0
i=0
fahrzeug_array= []
fahrzeug = Verkehrsmittel()
while(i<len(verkehrsmittel)):
    if (i==0):
        fahrzeug.verkehrsmittel.append(verkehrsmittel[0])
        fahrzeug.ziel.append(ziel[0])
        fahrzeug.uhrzeit.append(uhrzeit[0])
        fahrzeug_array.append(fahrzeug)
    else:    
        for h in fahrzeug_array:
            if(verkehrsmittel[i]==h.verkehrsmittel) and (ziel[i]==h.ziel)):
    ##            print "verkehrsmittel doppelt "+ "ziel doppelt"
                h.uhrzeit.append(uhrzeit[i])
                gefunden=1
                
        if(gefunden==0):
        ##  print "neues verkehrsmittel bzw. wohlmöglich gleiches Verkehrsmittel nur neues Ziel"
            fahrzeug = Verkehrsmittel()
            fahrzeug.verkehrsmittel.append(verkehrsmittel[i])
            fahrzeug.ziel.append(ziel[i])
            fahrzeug.uhrzeit.append(uhrzeit[i])
            fahrzeug_array.append(fahrzeug)

    i=i+1
    gefunden=0


[..]
##ausgabe 
for a in fahrzeug_array:
    print a.verkehrsmittel
    print a.ziel
    print a.uhrzeit

ich bin mir absolut sicher dass sich einige python leser hier sich nun die haare rausreißen - aber bitte verzeiht mir ( Der Code ist leicht zur verständnis verändert) es funktioniert so und das reicht mir erstmal.



Noch einmal vielen vielen Dank für die oberen Kommentare !!!! Durch diese bin ich auf die Idee gekommen
Zuletzt geändert von Anonymous am Freitag 8. März 2013, 01:53, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@DerBorsti: Ich frage mich gerade ernsthaft ob Du ein Troll bist oder was Du Dir dabei gedacht hast hier nach Rat zu fragen den Du sowieso ganz bewusst nicht verwenden willst. Warum schreibst Du Python-Quelltext, wenn Du ganz offensichtlich überhaupt nicht Python verwenden willst? Der Quelltext könnte kaum „unpythonischer” aussehen wenn man ihn mit Absicht so unschön und umständlich wie möglich schreiben würde.

Wenn das aufgrund der Kommentare entstanden ist, dann hast Du die nicht gelesen oder nicht verstanden.

Die Lösung ist nämlich auch algorithmisch schlecht, wäre es also in äquivalenter Form auch in C++ oder Java. Zum einen die Wahl der falschen Sprachmittel (``while`` mit Index statt ``for`` über die Elemente), dann der falschen Datenstrukturen und -typen (lineares durchsuchen von Listen statt Direktzugriff über Wörterbücher, `int` statt `bool`), und auch was die unnötige Komplexität durch die Sonderbehandlung von ``i == 0`` angeht. Das `verkehrsmittel`, `ziel`, und `uhrzeit` drei parallele Listen mit jeweils elementweise zusammengehörenden Daten sind, spricht auch nicht für einen durchdachten Entwurf.

Ich glaube auch nicht dass das überhaupt so funktioniert, denn es scheint da werden Objekte mit Listen mit einem einzigen Objekt als Inhalt verglichen was natürlich immer `False` ist.
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

BlackJack hat geschrieben:@DerBorsti: Ich frage mich gerade ernsthaft ob Du ein Troll bist oder was Du Dir dabei gedacht hast hier nach Rat zu fragen den Du sowieso ganz bewusst nicht verwenden willst. Warum schreibst Du Python-Quelltext, wenn Du ganz offensichtlich überhaupt nicht Python verwenden willst? Der Quelltext könnte kaum „unpythonischer” aussehen wenn man ihn mit Absicht so unschön und umständlich wie möglich schreiben würde.

Wenn das aufgrund der Kommentare entstanden ist, dann hast Du die nicht gelesen oder nicht verstanden.

Die Lösung ist nämlich auch algorithmisch schlecht, wäre es also in äquivalenter Form auch in C++ oder Java. Zum einen die Wahl der falschen Sprachmittel (``while`` mit Index statt ``for`` über die Elemente), dann der falschen Datenstrukturen und -typen (lineares durchsuchen von Listen statt Direktzugriff über Wörterbücher, `int` statt `bool`), und auch was die unnötige Komplexität durch die Sonderbehandlung von ``i == 0`` angeht. Das `verkehrsmittel`, `ziel`, und `uhrzeit` drei parallele Listen mit jeweils elementweise zusammengehörenden Daten sind, spricht auch nicht für einen durchdachten Entwurf.

Ich glaube auch nicht dass das überhaupt so funktioniert, denn es scheint da werden Objekte mit Listen mit einem einzigen Objekt als Inhalt verglichen was natürlich immer `False` ist.
Okay nehme ich jetzt mal so hin - Ich bin immer offen für Kritik und geb mein bestes beim nächsten mal bzw. bei der Überarbeitung.
-Bool und Int -> ja stimmt vollkommen ....
-Sonderbehandlung hätte man auch ausserhalb machen können ;)
-"lineares durchsuchen von Listen statt Direktzugriff über Wörterbücher" - ich habe festgestellt, dass mein Datensatz maximal 30 Einträge sind aber ja auch hier hast du recht.
-Durchdachten Datenentwurf: hmm dies war ja meine Ausgangsfrage - ich habe es nun erstmal so gelöst, aber werde es noch einmal komplett überarbeiten
Der Gedanke an diesem Code ist folgender ->
Ich habe n Anzahl an Objekten von Typ Verkehrsmittel die ich in ein Array schreibe. Jedes Verkehrsmittel hat / kann n Ziele und n Uhrzeiten für Abfahrt/Ankunft haben.

Korrekt - der so dargestelle Quellcode funktioniert nicht - würdest du / ihr sehen wie ich die Strings bearbeite würdest du mir sicher empfehlen Python zu löschen :D ... Es ist sicher nicht lustig, aber ich freue mich über meinen Erfolg es im wahrsten Sinne des Wortes "irgendwie" hinbekommen zu haben - nun gehts daran dies zu überarbeiten... Ich würde sogar ggf. dies hier erneut reinstellen falls du nicht als mod sagst "sowas möchten wir hier nicht sehen"

Beste Grüße

€dit
Ich möchte noch einmal betonen, dass ich die Kommentare wirklich zu herzen genommen habe und auch wirklich die angegeben Stichwörter recheriert habe. Das ich nun aber jetzt diese erstmalige Lösung gefunden habe und somit gegen jedes Kommentar verstosse tut mir leid !
BlackJack

@DerBorsti: Die Sonderbehandlung bei i=0 hätte man komplett weglassen können, ohne dass sich etwas am Ergebnis ändern würde. Denn das ist ja genau der Code der ausgeführt wird wenn bei i=0 in `fahrzeug_array` kein Suchtreffer erfolgt. Und das sollte man als sicher ansehen können wenn `fahrzeug_array` leer ist.

Mal davon abgesehen das Typen nicht in Namen verwendet werden sollten, weil es gar nicht so selten ist, dass man den Typen ändert und dann entweder der Name irreführend ist, oder überall geändert werden müsste, ist das eine Liste und kein Array. Arrays gibt es unter den Grundatentypen von Python nicht, und wenn man in Python von Arrays spricht ist damit in den allermeisten Fällen der Datentyp aus dem `numpy`-Paket gemeint.

Nur mit den Grundatentypen und `collections.defaultdict` sollte sich die ``while``-Schleife mit drei Zeilen ausdrücken lassen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

In Code sagt mehr als tausend Worte:

Code: Alles auswählen

import collections
[..]
fahrplan = zip(verkehrsmittel,ziel,uhrzeit) # keine drei Listen, sonder nur eine!
fahrzeug_array = collections.defaultdict(list)
for verkehrsmittel,ziel,uhrzeit in fahrplan:
    fahrzeug_array[verkehrsmittel,ziel].append(uhrzeit)
[..]
##ausgabe 
for (verkehrsmittel,ziel),uhrzeit in fahrzeug_array.iteritems():
    print verkehrsmittel
    print ziel
    print uhrzeit
Die Variablennamen habe ich unangetastet gelassen, um sie wiederzuerkennen.
Antworten