Listenelement eine Variable zuordnen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

Hallo zusammen,
ich bin Anfänger und habe Probleme mit den Listen.
Ich will den Inhalt eines Elementes einer Liste einer Variable zuordnen.

Kurz eine Beschreibung:
Ich habe eine einfache Liste mit 20 Elementen.
Über eine For Schleife habe ich diese Elemente mit "0" gefüllt.
In Abhängigkeit eines Taster wird nun je nach Stand des Schleifenzählers dieses Element mit einer "1" gefüllt.

Bis hier hin klappt alles super. :P

Nun will ich bei allen Elementen in denen eine "1" steht die entsprechende LED einschalten.
Da zu soll eine Variable mit den Wert "1" gefüllt werden und mir der Index Wert in der Liste angezeigt werden.

Kann mir hier jemand weiter helfen?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du solltest darauf verzichten, die Strings "0" und "1" zu verwenden. Dafuer nimmt man die Wahrheitswerte False und True.

Und fuer dein eigentliches Problem brauchst du doch nur eine Liste mit korrespondierenden GPIO-Nummern, und mit

Code: Alles auswählen

for gpio, an in zip(LED_GPIOS, schalter_zustaende):
      schalte_gpio(gpio, an)
schaltest du dann die LEDs. Es ist dabei ja unerheblich, ob du wiederholt die gleiche LED auf den gleichen Wert setzt.
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

hmmm????

Vielen Dank für die Antwort aber im Augenblick verstehe ich hier nur "Bahnhof" :?:

Leider habe ich da zu wenig Erfahrung was damit gemeint ist?
Ich müsste da schon eine Ausführlichere Erklärung dazu haben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Manny: zeige Code, dann wird schneller klar, wo das Problem liegt und auf welchem Niveau man mit Erklären anfangen muß.

Du schreibst, Du hast eine for-Schleife, dann dürfte in der Lösung von __deets__ die for-Schleife kein Bahnhof sein. Was zip macht, kann man in der Dokumentation nachlesen und dann an verschiedenen Beispielen interaktiv ausprobieren, bis man verstanden hat, was man damit machen kann. Variablen- und Funktionsnamen sind nur Beschreibungen von dem, was da für Inhalt sein müßte, um das Problem zu lösen, weil wir Deinen Code nicht kennen und damit nicht die von Dir verwendeten Variablennamen benutzen können.
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

hier mal kurz vorab zur Info:
Ich habe eine Liste mit 20 Werten, 0 oder 1

bei einer 1 im Wert soll er eine LED einschalten und dann in ein Unterprogramm springen.
Am Besten den Inhalt in einer Variablen speichern zur späteren Verarbeitung.

Ich habe mir das im Code so vorgestellt:
-------------------------------------------------------------------------
# ld ist meine Liste
# led ist mein GPIO der angesprochen werden soll

#in meiner Liste ld[] sind 20 Werte (0 oder 1)

def springe():
#weitere Anweisungen

for i in range(20):
If ld = 1 : #wenn der Wert 1 ist soll die LED eingeschaltet werden und das Unterprogramm "springe" ausgeführt werden.
led_.on(i)
springe()
print("LED",ld," ist on"
else:
# nichts machen
-------------------------------------------------------------------------
Hier bekomme ich immer eine Fehlermeldung, vielleicht nur ein Syntax Fehler?
Ich kenne mich dazu einfach zu wenig aus.

Vielleicht kann man auch meine Liste "ld[]" in 20 einzelne Variablen auflösen die ich dann weiter verarbeiten kann?
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

hmm?
irgendwie wurde bei dem speichern jetzt die Einrückung in meinem Code entfernt?
wie kann man den Code hier so darstellen wie weiter oben ?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Manny: Du mußt im Forum [ code ] -Tags benutzen. Der Code ist so nicht lesbar, weil so viele Syntaxfehler drin sind, die Du alle erst beheben mußt. Wenn eine Fehlermeldung kommt, die Du nicht verstehst, dann poste die hier komplett, sonst kann man da nicht helfen.

Was macht den `springe`? Da es nicht von der LED abhängig ist, macht das für jede LED auf 1 das selbe?
Die for-Schleife ist falsch, da Du ja über die ld-Liste iterieren mußt, eine Liste ist nie == 1.
Und wo ist jetzt das konkrete Problem?
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

springe() habe ich nur mal so genannt, könnte z.B. eine LED dann blinken lassen.

Ja genau, soll es auch. Wenn ich in meiner Liste z.B. im Liste[3] und im Liste[12] eine 1 stehen habe,
sollen die korrespondierenden LED's 3 und 12 einschalten oder blinken.

Code: Alles auswählen


ld   # ist meine Liste
led  # ist mein GPIO der angesprochen werden soll

#  in meiner Liste ld sind 20 Werte (0 oder 1) 

def springe():
	#weitere Anweisungen, z.B. LED's blinken
	
	

for i in range(20): 
	If ld[i] = 1 :       #wenn der Wert 1 ist soll die LED eingeschaltet werden und das Unterprogamm "springe" ausgeführt werden.
		led_.on(i)
		springe()
		print("LED",ld[i]," ist on"
	else:
		# nichts machen
	
Die for-Schleife ist falsch, da Du ja über die ld-Liste iterieren mußt, eine Liste ist nie == 1.
genau das verstehe ich nicht was damit gemeint ist?

Wie mache ich das: "ld-Liste iterieren " in meinem Fall?
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Das sieht ja schon mal etwas besser aus als vorher. Ein paar Stellen müsstest du allerdings noch reparieren:

Code: Alles auswählen

for i in range(20): 
	If ld[i] = 1 :       # hier meintest du sicherlich einen Vergleichsoperator (https://www.python-kurs.eu/operatoren.php), und "If" gibt es nicht, sondern nur "if"
		led_.on(i)
		springe()
		print("LED",ld[i]," ist on" # hier fehlt eine Klammer
	else:
		# nichts machen
Oder in etwas schöner:

Code: Alles auswählen

for i in ld:
	if i == 1:
		led_.on(i)
oder aber (mit numpy):

Code: Alles auswählen

for i in np.where(ld):
	led_.on(i)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein Code ist so auf vielen Ebenen falsch. Neben Syntaxfehlern wie if mit großem I, nicht geschlossenen Klammern, fehlenden Statements im Else-Zweig enthält er auch einen kapitalen Denkfehler: du schaltest LEDs nur an. Nie aus. Also kannst du sie gleich alle anschalten, und dir das mühselige Programmieren sparen.

led_.on(i)

auch nichts, das ich jemals irgendwo im Zusammenhang mit GPIOs auf dem PI gesehen habe.

Hast du ein FUNTIONIERNDES Beispiel laufen, das wenigstens EINE LED ansteuert? Damit man sich von da voran arbeiten kann?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn deine LED-Objekte die aus gpiozero sind, dann geht das hier:

Code: Alles auswählen

ld = [True, False]
leds = [LED(Pin_nummer), LED(andere_pin_nummer)]
....
for wert, led in zip(ld, leds):
      led.value = wert
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

@ArtooDetoo

vielen Dank, ich werde das mal in Ruhe testen :P
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

@__deets__

Das ist nur ein Teil des gesamten Programmes, nur keine Angst, ich schalte die LED's auch wieder aus aber das ist hier unrelevant.

Es geht hier lediglich darum eine oder mehrere LED's in Abhängigkeit von 20 Werten meiner List einzuschalten.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

nun, ich hab dir gezeigt wie ich es machen würde. So oder so ähnlich macht man das nunmal. Der Code von ArtooDetoo ist in dieser Beziehung wirkungslos, weil er zwar deine Fehler korrigiert hat, aber nicht das eigentliche Problem gelöst hat - die Zuordnung. Denn led.on(Nummer) ist garantiert nicht richtig, weil es so ein Objekt mit einer Methode nicht gibt. Man könnte es sich schreiben. Dann steckt die Liste die ich angelegt habe halt in dem Objekt. Aber du hast das Objekt nicht, und damit hilft der Code auch nicht weiter.
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

@__deets__

lieb gemeint von Dir aber leider bin ich da noch nicht so fit mit den Fachausdrücken. Ich muss das mit einfachen Worten erklären:

Ich will halt wissen in welchen Werten meiner List eine 1 steht
Der Code von ArtooDetoo ist in dieser Beziehung wirkungslos
Stimmt,
er zeigt mir das ich z.B. 2 Werte mit einer 1 habe aber nicht wo diese jetzt genau steht

Ist es jetzt die Position Liste[3] und Liste[12] oder ist es Liste[7] und Liste[18]

Mich interessieren die Indexwerte

Aber genau das ist für mich wichtig da ich dann gezielt diese LED auf On schalten kann.
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Eigentlich tut mein Code das schon, ich habe nur den Fehler in der print-Funktion übersehen, in der statt

Code: Alles auswählen

ld[i]
in diesem Fall nur i stehen sollte.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Zuordnung der LEDs zu einem Index löst man, indem man eine Liste macht, in der am entsprechenden Index das LED Objekt ist. So wie ich das wiederholt gezeigt habe. Eine Alternative wäre ein Wörterbuch, aber nur dann, wenn man deutlich weniger LEDs als Schalter hat. Hast du nicht. Und zu guter Letzt gibt’s natürlich auch noch die allseits beliebte if-Kaskade. Macht man so nicht, aber was soll’s.

Code: Alles auswählen

if ld[0]:
     led_fuer_index_null.on()
if ld[1]:
     diese_andere_led.on()
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

Das mit der Kaskade kann ich noch am einfachsten nachvollziehen.
Jetzt schalte ich zwar die LED's dazu an aber so schalte ich doch alle an?

Es sollen aber nur die angehen die den Wert 1 haben, alle Anderen haben den Wert 0 und sollen aus bleiben.

Besteht nicht die Möglichkeit das mir das Programm den Index Wert zurück gibt bei dem eine 1 steht.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Genau das tut das if doch. Einschalten wenn der Wert an de stelle wahr ist. NICHTS machen, wenn er falsch ist. Simpler geht es nicht.
Manny
User
Beiträge: 13
Registriert: Mittwoch 5. Dezember 2018, 18:44

hmm, ich habe das jetzt mal getestet:

Code: Alles auswählen

if ld[0]:
     led_fuer_index_null.on()
if ld[1]:
     diese_andere_led.on()
habe aber anstatt eine LED anzusteuern mir lediglich den wert anzeigen lassen mit print
Leider klappt das so nicht, ich bekomme nur die 1 oder 0 angezeigt nicht aber den Index, das müssten die Zahlen von 0-19 bzw. 1-20 sein
Antworten