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

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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:

  • Anfänger Probleme mir array's (bzw liste von listen)? Schau mal ob du hier fündig wirst!

  • 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-

    • Offizieller Beitrag

    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 :)

  • @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
    • Offizieller Beitrag

    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.

    Zitat


    .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.


  • 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.


  • 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:

  • 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

  • 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:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!