Int-Werte aus dict{} extrahieren

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
MartinS
User
Beiträge: 2
Registriert: Montag 21. November 2016, 20:25

Hallo,
ich arbeite gerade mit dem SensHat von RaspPi.

Ziel: das Programm soll vorerst 8 Zufallsfarben generiern :ok.
Da war meine Vorstellung (kenne ein wenig C/C++ und PHP ) ich fülle einen Array.
Da Python diese nicht zur Verfügung stellt bediente ich mich einer Liste (list).
Diese konnte ich nicht, (wie ich es kenne) in einer for-Schleife indexieren

BSP
[codebox=c file=Unbenannt.c]
for(i=1; i<=10; i++)
{
}
[/code]
erste Subfrage, geht das?
Dazu bitte erst weiterlesen da nach meinem jetztigem Wissen jeweils [key: value]
zu jedem "key" ein "value-Wert" gehört.

Meine Lösung, weil Tutorials, Bücher, Foren diese Möglichkeit boten
den Weg über ein Dictionary

meine Lösung dazu:

Code: Alles auswählen

from sense_hat import SenseHat
from random import randint
from time import sleep

sense = SenseHat()

x = 0       # x Koordinate der LED Matrix
y = 0       # x Koordinate der LED Matrix   

def farben (r, g, b):
    #""" Generiere neue Zufallsfarbe """
    r = randint(0, 255)
    g = randint(0, 255)
    b = randint(0, 255)
    return (r, g, b);

    # besorge mir 8 Zufalls_Farben brauch ich zu Anfang
    # index 0 bis 7 liegen im Dictionary
    # in Form 0:[78, 173, 254]

rgb_x = {}
for i in range(8):
    rgb_x[i] = [(farben('r', 'g', 'b'))]
            
#print (rgb_x)

#print ( rgb_x[0])

for value in rgb_x:
    print(rgb_x[value]) #dient der Kontrolle was gelesen wurde


SO und jetzt brauch ich den ersten rgb-Wert also drei INT-Werte z.B. 104, 251, 025

Meine Lösung die Werte aus dem "dict" in eine "list" überführen.
dh.

Code: Alles auswählen

rgb01 = []
rgb02 = []
rgb03 = []
rgb04 = []
rgb05 = []
rgb06 = []
rgb07 = []
rgb08 = []
rgb01 = rgb_x[0]
rgb_01 = rgb01[0]

rgb02 = rgb_x[1]
rgb_02 = rgb02[0]

rgb03 = rgb_x[2]
rgb_03 = rgb03[0]

rgb04 = rgb_x[3]
rgb_04 = rgb04[0]

rgb05 = rgb_x[4]
rgb_05 = rgb05[0]

rgb06 = rgb_x[5]
rgb_06 = rgb06[0]

rgb07 = rgb_x[6]
rgb_07 = rgb07[0]

rgb08 = rgb_x[7]
rgb_08 = rgb08[0]
und genau das finde ich eher umständlich

Die Ausgabe bzw. die Weiterverwendung erfolgt dann über eine "SensHat - Funktion"

Code: Alles auswählen

sense.set_pixel(x, y, rgb_01[0], rgb_01[1], rgb_01[2])
Das Programm macht das was es soll, aber schöner Code schaut anders aus.

Welche Möglichkeiten gibt es denn, die Funktion

Code: Alles auswählen

def farben (r, g, b):
    #""" Generiere neue Zufallsfarbe """
    r = randint(0, 255)
    g = randint(0, 255)
    b = randint(0, 255)
    return (r, g, b);
8mal aufzurufen und die Werte in der Form

Code: Alles auswählen

sense.set_pixel(x, y, rgb_01[0], rgb_01[1], rgb_01[2])
zu erhalten, das ganze muss in einer " Art Variablen " geschehen. Der einzelne der 8 Werte, wird dann jeweils 8mal
abgerufen. (LED-Matrix 8x8)

Unterschiedlichste Klammerformen wurden probiert. Also wenn die Klammern die Lösungs des Problems bieten würden,
dann bitte, die richtige Syntax in der exakten Schreibweise posten.

Da ich die Suchfunktion der div. Suchmaschinen bemüht habe, leider gar nicht so richtig weiß, wie das Problem denn richtig benannt werden könnte, frag ich mal die Profis

Danke und Grüße
Martin
BlackJack

@MartinS: Arbeite am besten mal das Tutorial in der Python-Dokumentation durch. Mit dem Wissen in einer Programmiersprache zu versuchen in einer anderen Programmiersprache zu programmieren geht selten gut. Eigentlich nur wenn sich die Sprachen *sehr* ähnlich sind.

Listenwerte kann man über ihren Indexwert ansprechen, allerdings müssen die Werte an der Stelle dann auch existieren. Zuweisen geht auch nur wenn man damit einen vorhandenen Wert ersetzt. Wenn man eine Liste mit Werten erstellen will, fängt man mit einer leeren Liste an und hängt dann die Werte hinten dran. Wenn Du C++ kannst, dann denke bei Listen eher an den STL-Datentyp `vector` und nicht an Arrays. Alternativ bietet sich manchmal auch die „list comprehension“-Syntax zum erstellen einer befüllten Liste an.

Wenn man eine Liste mit Werten hat und mit denen der Reihe nach etwas machen will, dann geht man nicht über dem Umweg mit einem Index, sondern schreibt eine Schleife die direkt über die Werte iteriert. Also in C++ einen Iterator über den `vector` oder in PHP die ``foreach``-Schleife.

Beim Code wird's etwas abenteuerlich. Du übergibst der `farben()`-Funktion drei Argumente die nicht verwendet werden. Wozu soll das gut sein?

Dann steckst Du in das `rgb_x`-Wörterbuch als Werte Listen die jeweils nur *ein* Element enthalten, nämlich das Tupel welches die `farben()`-Funktion liefert. Was soll diese Liste?

In der Schleife danach nennst Du den Schlüssel `value`, was mehr als verwirrend ist. Zudem interessiert Dich `value` an der Stelle gar nicht weil Du das nur als Schlüssel in das gleiche Wörterbuch verwendest. Da hättest Du auch gleich über die Werte iterieren können.

Und dann wird es total wirr. Durchnummerierte Namen deuten fast immer darauf hin das man eigentlich eine Datenstruktur haben wollte. Oft eine Liste. Die sollte bei Dir eigentlich von Anfang an die Struktur sein wo Du die Farbtupel speicherst.

Die ersten 8 Zeilen sind überflüssig. Du bindest dort leere Listen an Namen die Du gleich danach an andere Werte bindest. Und bei dem `rgb01` vs. `rgb_01` Namen frage ich mich wieder was das soll und warum die Tupel jeweils als einziger Wert in einer Liste verpackt wurden. Du findest das alles zurecht umständlich, ich sehe dahinter noch nicht mal einen *Sinn*.
BlackJack

Mangels eines Sense Hat vollkommen ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from random import randint

from sense_hat import SenseHat


def create_random_color():
    return [randint(0, 255) for _ in xrange(3)]


def main():
    sense_hat = SenseHat()
    random_colors = [create_random_color() for _ in xrange(8)]
    for i in xrange(8):
        for j in xrange(8):
            sense_hat.set_pixel(j, i, *random_colors[(i + j) % 8])


if __name__ == '__main__':
    main()
MartinS
User
Beiträge: 2
Registriert: Montag 21. November 2016, 20:25

BlackJack, danke der Mühe,

hab ich vermutet, dass dann schöner straffer Code von mir erst mal nicht verstanden wird.
Jetzt hab ich jedoch die gesuchten Ansätze und kann Bücher, Tut's und sonstige Quellen zu Rate ziehen.

Danke nochmal
Antworten