Anfänger Probleme mir array's (bzw liste von listen)

  • Moin


    Man mag es kaum glauben - aber ich brauch auch mal ein bisschen Hilfe (hab ich schon erwähnt das ich Python hassssse? :()


    Und zwar versuche ich krampfhaft seit ein paar Tagen die TinyTX Sensor Daten, die ich in einer SQLite Datenbank gespeichert hab, auf einem kleinen SPI Display über Framebuffer, mithilfe von pygame, darzustellen - das Display funktioniert also das ist hier nicht das Problem...


    Orientieren tue ich mich an folgenden Scripts:
    http://ph-elec.com/archives/rpi-small-lcd-display/
    https://github.com/notro/fbtft/wiki/Pygame
    http://www.gtkdb.de/index_36_2229.html


    Dazu habe ich mir folgendes Script zusammengeschustert:



    Wenn ich das ausführe erhalte ich folgende Fehlermeldung:


    Ich versteh nicht was der von mir will.. Ich dachte 'data' ist sowas wie ein Array?
    Wenn ich in das mir bekannte Format änder: data[p] = place ändert sich leider nichts...


    (hab ich schon erwähnt das ich Python hassssse? :()



    Was mach ich falsch? :@



    :danke_ATDE:

  • Ja ich bin mir sicher ... es ändert nämlich nix an der Fehlermeldung wenn ich die def-definitions Zeile auskommentiere... Siehe oben: Erst sobald ich data.p und data.t einfüge gibts ne Fehlermeldung
    Oder guck dir das weather.py an, da stehts auch so drin.

  • Also ich finde in anderen Files nict so was:

    Code
    def UpdateWeather():
        global data, LastUpdate
        "Get Data from SQLite Sensor-Database"


    sondern so was:

    Code
    def UpdateWeather():
        "Get Data from SQLite Sensor-Database"
        global data, LastUpdate



    nur um auch noch mal sicherzustellen, dass wir von der selben Stelle im Script reden.



    cu,
    -ds-

    • Official Post

    Hiho, dann versuch ich mal etwas Licht ins dunkel zu bringen.
    Wenn du "global data" sagst, heisst das nicht, dass du eine Variable namens data neu anlegst und global definierst, sondern das python eine varibale data sucht, die ausserhalb der funktion existiert (und somit global ist). Du hast aber data nirgendswo definiert.


    Beispiel:

    Code
    a="Hallo Meigrafd"
    def test():
     global a
     return a
    
    
    test()
    Ausgabe: "Hallo Meigrafd"


    Code
    def test():
     global a
     return a
    
    
    test()
    Ausgabe: Global name "a" is not defined


    Beim letzeren wurde "a" nirgends definiert was zu dem dir bekannten Fehler führt.


    dein data.t, data.p funktioniert so nicht (verwechselst du das mit self?). Egal, ich würde es so machen (und gleichzeitig sogar die "bösen" globals loswerden)


    Wann immer du jetzt aktuelle Werte brauchst machst du ein

    Code
    aktuelleWerte=UpdateWeather()


    und hast dann mittels

    Code
    aktuelleWerte["Sensorname"][0]  #LastUpdate des Sensors
    aktuelleWerte["Sensorname"][1]  #Temperatur des Sensors


    Ich hoffe bloss das ich das alles richtig interpretiert habe ;)


    Hier nochmal ein vereinfachtes Beispiel

    Code
    def dictreturn():
    	a ={}
    	a["Sensor1"]=["21.02.14", 5]
    	a["Sensor2"]=["20.02.14", 20]
    	return a
    
    
    b = dictreturn()
    b["Sensor1"][1] #5
    b["Sensor2"][0] #20.02.14



    Mal sehen wieviele Einrückungen er zerlegt hat beim Kopieren in den Post :lol:


    Nachtrag: Python ist toll :)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().

  • @dramshader: Nu häng dich mal bitte nicht an der "Get Data from SQLite Sensor-Database" Zeile auf, die hat mit dem Problem nix zu tun - ich wiederhole mich nochmals: Wenn ich die Zeile LÖSCHE ändert das NICHTS an dem Problem



    dbv: Wenn ich die global Zeile im "def UpdateWeather():" raus nehme kommt diese Fehlermeldung:

    ...also genau das selbe...




    damit dreamshader sich nicht weiter wegen der kommentar zeile aufregt hier der aktuelle code den ich für die aktuelle/selbe fehlermeldung genutzt hab:


    Das abzuändern in data["place"] usw bringt ebenfalls nichts:

  • Zu dem Zeitpunkt wurde die Variable data noch nicht initialisiert und es ist nicht bekannt von welchem Type die Variable ist. Ein paar Zeilen drüber wird LastUpdate initialisiert. Sowas fehlt für data. Deshalb der Fehler.


    So wie ich das sehe wird data auch nicht später benutzt und Du bist da am probieren. Deinem Kommentar nach willst Du sie als Array benutzen. Arrays gibt es in Python nicht standardmässig. Nur Listen. Es gibt aber die Möglichkeit array zu importieren. Was möchtest Du da genau in data ablegen und wie möchtest Du später drauf zugreifen?


    Eine Möglichkeit data als Liste mit 100 Elementen zu zu initialisieren ist per

    Code
    data=[0]*100


    möglich.


    Dann kannst Du mit

    Code
    a[5] darauf zugreifen

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    • Official Post

    Schlimm wenn 3 Leute gleichzeitig lange Posts schreiben ;), hochgradig verwirrend. Ich mag Dictionaries, das sind coole x dimensionale Array'ische Strukturen, mit dem Vorteil das im Value Feld auch wieder [listen] oder {dicts} sein können die wiederum...und so weiter. Es wird nur irgendwann schwer ein bestimmtes Feld anzusprechen ;)


    Wie framp schon sagte, richtige Arrays gibt es nicht und werden auch nicht gebraucht (wenn pythonisch denkt)


    Ich habe oben einen Weg ohne globals beschrieben, sollte sogar funktionieren.


  • Schlimm wenn 3 Leute gleichzeitig lange Posts schreiben ;), hochgradig verwirrend.


    Jupp, vor allen Dingen weil keiner mitbekommt was gerade von anderen geschrieben wird.

    Quote


    .Ich mag Dictionaries, das sind coole x dimensionale Array'ische Strukturen, mit dem Vorteil das im Value Feld auch wieder [listen] oder {dicts} sein können die wiederum...und so weiter. Es wird nur irgendwann schwer ein bestimmtes Feld anzusprechen ;)


    Die benutze ich auch gerne, nur ist ein dictionary nicht äquivalent zu einem (mathematischen) array - ausser man macht es wie in awk und benutzt n Indizes als Key zum Lookup im Dictionary. Hat den Vorteil dass man Speicherplatz spart wenn das Array nur dünn besetzt ist. Deshalb gibt es ja noch das array Paket in Python. Die Frage ist was genau mit data getan werden soll. Aus dem Code ergibt sich das nicht da die Daten später nicht benutzt werden.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    Edited once, last by framp ().

    • Official Post

    Vor allem sind dicts ein schöner Weg viele Werte aus einer Funktion zu returnen. Gefällt mir besser als ein

    Code
    def test():
        #do some stuff here
        return a,b,c
    d,e,f = test()

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Edited once, last by dbv ().


  • Vor allem sind dicts ein schöner Weg viele Werte aus einer Funktion zu returnen.


    Das ist der Weg um die Einführung von Objecten zu umgehen. Da Python auch eine OOP ist ist es bei grösseren Projekten besser eine Klasse zu erstellen um die Daten mitsamt ihren Methoden zu kapseln und in nur einem return Value zurückzugeben. Aber das ist häufig OO Overkill und ein Dict eine Alternative.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)


  • Vor allem sind dicts ein schöner Weg viele Werte aus einer Funktion zu returnen. Gefällt mir besser als ein

    Code
    def test():
        #do some stuff here
        return a,b,c
    d,e,f = test()


    Ich sach ja ... abartig dieses Python :s
    Kann ich mir nur als Katalysator zur Einweisung ins Pflegeheim oder die Psychatrie vorstellen :fies:


    cu,
    -ds-


  • Ich sach ja ... abartig dieses Python :s
    Kann ich mir nur als Katalysator zur Einweisung ins Pflegeheim oder die Psychatrie vorstellen :fies:


    Python mag vielleicht erst einmal abartig sein ... aber wenn man sich intensiver damit befasst ... findet man eine Menge Dinge, die das Programmiererleben leichter machen als in anderen älteren Programmiersprachen.Nicht nur das IPhone entwickelt sich weiter .... auch die Programmiersprachen :shy:

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Nö, ich kenne ja Deine C Leidenschaft :). Will nur vermeiden, dass sich Mitleser davon abschrecken lassen, sich mit Python zu befassen

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    Edited once, last by framp ().

  • Hm oke also was ich machen oder erreichen möchte ist folgender:


    Da das Display nicht allzugroß ist passen möglicherweise nicht alle Sonsorwerte auf eine Anzeige. Also jenachdem wieviel Werte ein Sensor liefert, möchte ich eben nur einen Sensor anzeigen und diese dann im zB 10 Sekunden Tackt durch switchen...


    UpdateWeather() liest von jedem Sensor die letzten Werte aus der DB aus und soll das dann in eine art Array (wie mans von bash oder PHP kennt) ablegen sodass ich über DisplayWeather() dann nur durch dieses Array gehe und anzeigen kann...
    Also zum Beispiel hab ich einen 'place' -> Wohnzimmer. Dieser liefert 2 Werte: Temperatur und Luftfeuchte
    Dann hab ich noch einen 'place' -> Terrasse. Dieser liefert ebenfalls 2 Werte: Temperatur und Luftfeuchte
    Und dann hab ich noch einen 'place' -> Sonne. Dieser liefert nur 1nen Wert: Temperatur (der Sensor ist tagsüber permanent direkt der Sonne ausgesetzt)


    Nun hab ich mir folgendes gedacht: Array 'data' anlegen -> data[place] = "$wert1,$wert2[,...]"
    Und über DisplayWeather() bräuchte ich dann nur sowas wie (ala php): foreach ($data AS $PLACE => $WERTE) { ..... }



    Wäre sowas mit Python machbar :huh:


    Ich bin halt LEIDER auf Python angewiesen weil wegen pygame..

  • So wie ich das verstehe brauchst Du auch kein Array sondern nur eine Liste die Du in Sequenz abarbeiten willst (foreach). Ich würde das in Kombination mit einem Dictionary loesen, welches die places beinhaltet und die places wiederum sind eine Liste der Werte.


    Die Erfahrung zeigt dass man auch meistens keine Arrays benoetigt sondern einfache Listen und Dictionaries. Da das ganze Collectionhandling in Java ja ziemlich schreibintensiv ist hat man deshalb auch in Groovy als Javaerweiterung Collections in die Sprache eingebaut.


    Anbei ein kleines Codesnippet zur Veranschaulichung:

    und das liefert dann

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    Edited once, last by framp ().

  • Ja schon aber nicht jeder hat die selbe Anzahl an 'place's ... Es sollte also möglichst flexibel gestaltet sein



    /EDIT: ich glaub ich bin jetzt ein guten Schritt weiter:


    Ausgabe:

    Code
    root@raspberrypi:/tmp# python t.py 
    Terrasse: 4.1 (1393027363)
    Wohnzimmer: 15.5 (1393049254)
    root@raspberrypi:/tmp#


    Das sieht schon mal brauchbar aus :D


    Muss ich das jetzt irgendwo " global " setzen also in einer anderen def :huh: