Einfache for-Schleife will nicht so ganz :(

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.
maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

Code: Alles auswählen

z_sm=[3, 0, 0, 0, 0, 0, 0, 0]
print(z_sm)
for i in z_sm:
    if i == 3:
        print(z_sm[i])
    else:
        print("Lecker Kuchen")
print()
/code]

Hallo, irgendwie klappts leider nicht; er soll doch das 1. Element der Liste ausgeben - und das ist 3 und nicht 0 -.- Jemand ne Idee?

[list]
0
Lecker Kuchen
Lecker Kuchen
Lecker Kuchen
Lecker Kuchen
Lecker Kuchen
Lecker Kuchen
Lecker Kuchen[/list]
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@maowmaow: Wenn das erste Element ausgegeben werden soll, dann musst Du halt Code schreiben der das macht. Im Moment vergleichst Du das aktuelle Element mit 3 und wenn es drei ist, dann nimmst Du es als Index in die Liste und erhältst damit das vierte Element (weil die Zählung bei 0 anfängt). Und das vierte Element ist 0.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

Also den ersten Satz hättest du dir sparen können, da das ein Python-Forum ist, wo man eben fragen kann. Und wenn es an der Art zu antworten scheitert, dann spar dir in Zukunft bitte die Antwort, da hab ich keinen Bock drauf. Die Antwort "Wenn der das machen soll sollst du halt so coden" kannste ja jeden an den Kopp knallen der hier ne Frage hat, meine Güte.

Ich schreibe seit exakt vorgestern Python, ich glaube man kann mir durchaus Fehler verzeihen ;). Und selbst wnen ichs seit 20 Jahren täte, wäre dem so.

Wie auch immer hab ich gedacht der setzt anfangs i=0 schaut ob das 0.- Element 3 ist (ist es). also print (z_sm[0]) - und das wäre halt die drei. So denkt man als Anfänger weeste. Mein Ziel ist jedenfalls das aktuell gültige ELement zu adereessieren, also das 0. wenn i=0 ist, das erste wenn i=1 ist etc.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@maowmaow: Du solltest lernen die hilfreichen Informationen aus einem Beitrag zu ziehen, ohne bei dem ersten Satz direkt eine Haken dran zu machen.

Fang an deinen Variablen vernünftige Namen zu geben, dann sollte ins Auge springen, was da falsch läuft:

Code: Alles auswählen

numbers=[3, 0, 0, 0, 0, 0, 0, 0]
print(numbers)
for number in numbers:
    if number == 3:
        print(numbers[number])
    else:
        print("Lecker Kuchen")
Wenn du nicht verstehst, was da passiert, musst den den Code Schritt für Schritt und Zeile für Zeile durchgehen und dir überlegen, was da passiert. Und das lässt du dir bestätigen, indem du dir an den entsprechenden Stellen die Wertee der Variablen anzeigen lässt.
Benutzeravatar
hyle
User
Beiträge: 96
Registriert: Sonntag 22. Dezember 2019, 23:19
Wohnort: Leipzig

Ich vermute eher der TO will nicht den dritten Scheifendurchgang sehen, sondern die 3 in der Liste, also müsste die Abfrage eher:

Code: Alles auswählen

if z_sm[i] == 3:
also in etwa so:

Code: Alles auswählen

z_sm=[3, 0, 0, 0, 0, 0, 0, 0]
print(z_sm)
for i in z_sm:
    if z_sm[i] == 3:
        print(z_sm[i])
    else:
        print("Lecker Kuchen")
(Natürlich ungetestet)
Alles was wir sind ist Sand im Wind Hoschi.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@hyle: Verstehen tut er das aber nicht, wenn du seine krude Benennung übernimmst.
Benutzeravatar
hyle
User
Beiträge: 96
Registriert: Sonntag 22. Dezember 2019, 23:19
Wohnort: Leipzig

Ja Du hast recht und das war auch Käse was ich schrieb. :oops:

//Edit:

@sparrow Du hast auch den Fehler im print (Zeile 5) übernommen. :wink:

So passts:

Code: Alles auswählen

numbers=[3, 10, 20, 30, 40, 50, 60, 70]
print(numbers)
for number in numbers:
    if number == 3:
        print(number)
    else:
        print("Lecker Kuchen") 
Alles was wir sind ist Sand im Wind Hoschi.
maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

Hallo und danke erstmal für eure Antworten; ich schau mir das mal an. Ganz gecheckt hab ichs glaube noch nicht, aber ich sitz ja erst seit 2 Minuten vorm PC ^^

Zu der "[...]kruden Benennung[...]" muss ich sagen; sicher hab ich nach so wenig Zeit nicht die Fertigkeit da vielleicht die treffendsten Benennungen zu geben, aber ich hab als Geologe da durchaus ne Vorstellung was z_sm bedeutet; es geht um Zuordnungswerte (Z) für Schwermetalle (SM). Das ist meine erste for-Schleife überhaupt und ich möchte halt später in die Liste da gewisse Werte sehen, mit denen eben gewisse Fallentscheidungen vorgenommen werden sollen. Ob die Lösung, die dann dabei rum kommt, irgendwie elegant ist is ne andere Frage. Sicher mach ich noch super viele Fehler. Bin mir bei dem gesamten "Projekt" was ich da gerade fabriziere eh net sicher, ob dass alles so passt oder nicht. Aber das gute ist wenigstens, dass ich ab und an mal nen richtigen Programmierer fragen kann was ich gut mache und wo ich was verbessern kann. Und solong nutz ich dazwischen eben das Forum und bedanke mich für eure Hilfe :) Aller Anfang is schwer ^^ Aber was die Benennung insgesamt angeht stimmt`s schon irgendwie: man weiß manchmal schnell nich mehr wie man das Kind nennen soll und verliert durchaus schnell den Überblick. Man muss dann vielleicht aussagekräftigere Variablennamen geben, aber z_sm ist für mein Verständnis eben aussagekräftig genug weil ich weiß worum es fachlich geht.
maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

hyle hat geschrieben: Dienstag 11. August 2020, 17:03 Ja Du hast recht und das war auch Käse was ich schrieb. :oops:

//Edit:

@sparrow Du hast auch den Fehler im print (Zeile 5) übernommen. :wink:

So passts:

Code: Alles auswählen

numbers=[3, 10, 20, 30, 40, 50, 60, 70]
print(numbers)
for number in numbers:
    if number == 3:
        print(number)
    else:
        print("Lecker Kuchen") 
Danke, das war es wohl :) Ich hätte mir also einfach i ausgeben lassen. Und sehe auch, für nen Anfänger mit mir isses mit number in numbers auch anschaulicher. Wenn ich später wieder so eine for-schleife machen will, da ich mit der bereits für eine gewisse Operation zu einem Ergebnis gekommen bin, würde dann, sofern ich da auch wieder ein i oder eben number verwende, dass einfach überschrieben ? Ja gelle? Meine ja Python liest so gesehen von oben nach unten.

Kleine Bonusfrage: GIbt es noch eine Funktion o.a., welche ich mir mal anschauen sollte um gleich mal zu prüfen, an welcher Stelle in der Liste diese 3 vorkommt? €dit: Irgendwas mit.count oder split vllt? ^^
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

Perfekt, danke dir :) Ich wusel mich da mal rein; schaut so aus, als könnt ichs gebrauchen :D
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@maowmaow: Du musst uns nicht erklären, was sich hinter deinen Namen verbirgt. Und offensichtlich ist ein sprechender Name dann 'zuordnungswerte_schwermetall'.
Und da das etwas mit dem Namen "Zuordnung" im Namen hat, sollte man sich auch gleich auf die Suche nach der passenden Datenstruktur machen, denn zugeordnet wird da ja nichts.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@maowmaow: Mit Abkürzungen ist das so eine Sache. sm – Schwermetalle, ok. Aber auch "Sales and Marketing" oder "Sado Maso" – ein beliebter (alter) Witz im Vertrieb, da ersteres zeitweilig durchaus zu Letzterem werden kann. Sprechende Namen helfen auch die eigenen Gedanke zu ordnen: gelingt es nicht einen passenden Namen zu finden, dann ist womöglich am Modell etwas falsch. Und gelegentlich ein "print" im Code, wenn man sich fragt, was da ab geht, kann oft eine gute Idee sein (quasi der Einstieg ins debuggen).
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

maowmaow hat geschrieben: Dienstag 11. August 2020, 19:49 Kleine Bonusfrage: GIbt es noch eine Funktion o.a., welche ich mir mal anschauen sollte um gleich mal zu prüfen, an welcher Stelle in der Liste diese 3 vorkommt? €dit: Irgendwas mit.count oder split vllt? ^^
Die Methode, um an den Index des ersten Vorkommens eines bestimmten Wertes zu kommen, heißt index(). Also einfach mal mit numbers.index(3) probieren. ;)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die Methode count hat eine Liste auch und Überraschung, sie zählt wie oft das übergebene Element in der Liste vorkommt.
Die Methode index einer Liste erfordert aber, dass das gesuchte Element wirklich in der Liste ist, da es ansonsten einen ValueError gibt.

Deswegen sieht man im Code oft diese Checks:

Code: Alles auswählen

if value in sequence:
    index = sequence.index(value)
else:
    ...
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Diese Checks bräuchte man nicht, wenn man sich die Grundlagen zum Exception-Handling durchgelesen hätte. Es wird hier ja gerade nicht sowas wie -1 für den Fehlerfall geliefert, gerade um solche Prüfungen zu vermeiden.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Der schlechte Variantenname ist i. Denn i steht normalerweise für Index. Ist es hier aber gar nicht, sondern es ist irgendeine seltsame Zuordnung. Und einen Index braucht man in Python ganz selten. Wenn die komischen Zahlen auch Indizes in eine andere Tabelle sind, dann ist das schon der Fehler. Also anstatt hier Funktionen zu nennen, die die Frage des TE beantworten, ohne die Hintergründe zu kennen, sollte man nach dem Kontext fragen.
@maowmaow: was willst du eigentlich machen? Woher kommen die Zahlen? Was ist der Sinn der Schleife?
maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

sparrow hat geschrieben: Dienstag 11. August 2020, 21:08 @maowmaow: Du musst uns nicht erklären, was sich hinter deinen Namen verbirgt. Und offensichtlich ist ein sprechender Name dann 'zuordnungswerte_schwermetall'.
Und da das etwas mit dem Namen "Zuordnung" im Namen hat, sollte man sich auch gleich auf die Suche nach der passenden Datenstruktur machen, denn zugeordnet wird da ja nichts.
Nein dort wird nichts zugeordnet (die Liste kommt ja schon "fertig" an bevor diese Schleife da anfängt) , aber fachlich schon (und der Teil ist nicht Bestandteil dieses Beispiels oben (Hab diesen Teil heute mal unseren hauseigenen Progger gezeigt und der meinte nur "Naja gut.. am Anfang hab ichs halt auch so gemacht; man weiß es ja erstmal nich besser. Es funktioniert und so weiter, aber du wirst mit der Zeit sowas wesentlich kürzer schreiben können und dir damit etwas Arbeit ersparen" *g). Aber ja sicher, wie man das mit dem Proggen verbessert etc. kommt hoffentlich irgendwie. Für mich macht die Benennung als Laie absolut Sinn, denn was ich da hantiere ist eine Liste mit sog. Zuordnungswerten, die eben für bestimmte Dinge (Geologie) fachlich von Relevanz sind (aber ja: beim proggen wird von mir aus da nix zugeordnet).

das mit dem i,index,count etc. seh ich ja alles ein, bin ja noob; und ich werd mich damit beschäftigen :)

Klar ich kann auch z_sm ausschreiben, aber macht für mich keinen ersichtlichen Unterschied, da mir wie gesagt absolut bewusst ist, worum es bei z_sm geht. Aber nochmal: Ihr seid der Meinung, dass ich mir beim proggen angewöhnen sollte das nun etwas treffender zu formulieren? wohl eher nicht so: numbers ; eher dann zuordnungswerte_schwermetalle; also ausgeschrieben? Oder doch etwas anders? Ich bin mir da selbst ja noch sehr unsicher und wär da für n kleines Tutorial á la "Das solltest du als Einsteiger besser nicht tun" irgendwie dankbar da ich aktuell seitlich versuche in die Materie reinzukommen und vermutlich vieles schlichtweg falsch mache. Ein Gedanke von mir war jedenfalls "wieso verwende ich dann nicht einfach numbers o.a. vllt. typische Dinge die man eben dann bei Python so benutzt?", denn bei so nem kleinen Skript/Programm kann so eine Variable ja durchaus überschrieben werden. Anders gefragt: Programmier ich so, also wenn ich ein paar mehr Variablen verwende als eigentlich nötig, tendenziell "unsauber", nutze vllt. zuviel des Speichers und werde über Kurz oder Lang mal Probleme bekommen was z.B. die Schnelligkeit meiner Proggis angeht; ganz zu Schweigen von der Nachvollziehbarkeit für andere Coder etc.?
maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

snafu hat geschrieben: Mittwoch 12. August 2020, 14:23 Diese Checks bräuchte man nicht, wenn man sich die Grundlagen zum Exception-Handling durchgelesen hätte. Es wird hier ja gerade nicht sowas wie -1 für den Fehlerfall geliefert, gerade um solche Prüfungen zu vermeiden.
Tut mir Leid das ich das alles noch nicht getan habe. Nee eigentlich nicht :P Ich bin Einsteiger und kommt Zeit, kommt auch Rat. Ich hoffe bloß allzu lang lässts net auf sich warten :D
maowmaow
User
Beiträge: 18
Registriert: Freitag 7. August 2020, 10:30

Sirius3 hat geschrieben: Mittwoch 12. August 2020, 16:28 Der schlechte Variantenname ist i. Denn i steht normalerweise für Index. Ist es hier aber gar nicht, sondern es ist irgendeine seltsame Zuordnung. Und einen Index braucht man in Python ganz selten. Wenn die komischen Zahlen auch Indizes in eine andere Tabelle sind, dann ist das schon der Fehler. Also anstatt hier Funktionen zu nennen, die die Frage des TE beantworten, ohne die Hintergründe zu kennen, sollte man nach dem Kontext fragen.
@maowmaow: was willst du eigentlich machen? Woher kommen die Zahlen? Was ist der Sinn der Schleife?
Huhu du. Also im Grunde schreibe ich gerade mein allererstes kleines Programm. Ich hab erst angefangen mit Python und hab mir bloß ein paar Tutorials angeschaut, aber mir war nach dem "Was ist ein String" Video etwas langweilig und wollt einfach mal rumprobieren. Drum hab ich angefangen mir eine kleine Aufgabe zu stellen die da lautet:

Gegeben seien bestimmte chemische Stoffe, welchen für bestimmte Grenzüberschreitungen, gewissen Zuordnungswerten beigemessen wird. Das Programm enthält eine einfache Eingabe, wo der Nutzer eben gefragt wird wie hoch für Stoff X irgend eine Konzentration ist. Das passiert nun auch für andere Substanzen. Anschließend sollen nur für diejenigen Stoffe mit den höchsten Zuordnungswerten die Namen der Stoffe ausgegeben werden. Da ich erstmal nicht wusste wie man das am besten umsetzt war eben die erste Idee "mach die Schwermetalle nach einander; ist er mit dem ersten fertig, kommt je nach zuordnung ne 0, 1, 2 oder drei in die Liste (ander Stelle hab ich z.B. .append kennen gelernt). Der macht das Jetzt für alle Schwermetalle und dann hast du eben eine Liste mit [3,0,0,0,0,03] oder was auch immer - wo wir dann bei meiner kleinen for schleife ankamen ^^. Also das Programm ist für mich ne Art Lernprozess; das ist auch der Grund, wies ich da nicht den ganzen Quellcoode reinpacke, weil da teils Dinge drin sind, mit denen ich irgendwas getestet habe etc. und vermutlich mobbt ihr mich dann und bewerft mich mit alten Computerkram :D


Für so Profis wie euch sicher trivial, aber so als Neuling gar nich so leicht. Ich nutz halt diese Aufgabe um etwas in die Grundlagen einzusteigen. Wie funktioniert dieses if elis else, was macht eine for schleife etc. Das hier war meine erste for-Schleife sozusagen. Ich hab den Fred gemacht um da zu einem Ergebnis zu kommen, wo ich glaube, dass es mir weiter hilft. Ich wollte weniger damit erreichen, dass mir noch wer hier das fertige Programm hinklatscht, wobei es gleichzeitig sicher gut wäre, wenn mir mal wer sagt, wie ich das vereinfachen kann. Kleiner Ausschnitt von dem was da passiert (will jez mal net ausschließen ob da nich was dabei ist, was vllt so erstmal nicht ersichtlich gebraucht wird; bestimmte Parameter hatte ich erstmal drin weil ich damit ggf. noch was vor hatte bzw. sind sie noch Teil meines Denkprozesses) Eines weiß ich schonmal z.B. nicht: Muss ich denn vorher Listen erstellen? Vermutlich Unsinn oder? Und schickt es sich jetzt, für jedes Schwermetall so einen langen Block an if/elif etc. zu schreiben oder kann man das nicht wesentlich eleganter machen? Das Problem wäre hierbei vielleicht, dass jede Spezies (also in dem Fall Schwermetalle), andere Grenzwerte hat:

Code: Alles auswählen

print("Geben Sie die Gehalte der Schwermetalle [mg/kg] an:")
eingabe_As = input("Arsen [As]: ")
z_sm=[]         # 
depV_sm=[]      # 
g_abfall=[]     # 
g_abf=[]        # ~
#As-Gw
if int(eingabe_As) <= 10:
    z_as=0
    z_sm.append(0)
    g_abfall_as=0
elif int(eingabe_As) >10 and int(eingabe_As) <= 450:
    z_as=1
    z_sm.append(1)
    g_abfall_as=0
elif int(eingabe_As) >450 and int(eingabe_As) <=1500:
    z_as=2
    z_sm.append(2)
    g_abfall_as=0
elif int(eingabe_As) >1500 and int(eingabe_As) <=5000:
    z_as=3
    z_sm.append(3)
    depV_as=1
    depV_sm.append(1)
    g_abfall_as=1
    g_abfall.append("As")
elif int(eingabe_As) >5000 and int(eingabe_As) <=10000:
    z_as=3
    z_sm.append(3)
    depV_as=2
    depV_sm.append(2)
    g_abfall_as=1
    g_abfall.append("As")
elif int(eingabe_As) >10000:
    z_as=3
    z_sm.append(3)
    depV_as=3
    depV_sm.append(3)
    g_abfall_as=1
    g_abfall.append("As")
    
Antworten