Seite 1 von 2
Einfache for-Schleife will nicht so ganz :(
Verfasst: Montag 10. August 2020, 21:27
von maowmaow
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]
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Montag 10. August 2020, 21:38
von __blackjack__
@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.
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 16:03
von maowmaow
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.
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 16:29
von sparrow
@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.
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 16:41
von hyle
Ich vermute eher der TO will nicht den dritten Scheifendurchgang sehen, sondern die 3 in der Liste, also müsste die Abfrage eher:
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)
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 16:45
von sparrow
@hyle: Verstehen tut er das aber nicht, wenn du seine krude Benennung übernimmst.
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 17:03
von hyle
Ja Du hast recht und das war auch Käse was ich schrieb.
//Edit:
@sparrow Du hast auch den Fehler im print (Zeile 5) übernommen.
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")
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 19:42
von maowmaow
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.
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 19:49
von maowmaow
hyle hat geschrieben: Dienstag 11. August 2020, 17:03
Ja Du hast recht und das war auch Käse was ich schrieb.
//Edit:
@sparrow Du hast auch den Fehler im print (Zeile 5) übernommen.
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? ^^
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 20:21
von kaytec
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 20:23
von maowmaow
Perfekt, danke dir

Ich wusel mich da mal rein; schaut so aus, als könnt ichs gebrauchen

Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 21:08
von sparrow
@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.
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Dienstag 11. August 2020, 22:17
von kbr
@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).
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Mittwoch 12. August 2020, 06:16
von snafu
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.

Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Mittwoch 12. August 2020, 14:05
von DeaD_EyE
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:
...
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Mittwoch 12. August 2020, 14:23
von snafu
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.
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Mittwoch 12. August 2020, 16:28
von Sirius3
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?
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Mittwoch 12. August 2020, 18:51
von maowmaow
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.?
Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Mittwoch 12. August 2020, 18:52
von maowmaow
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

Ich bin Einsteiger und kommt Zeit, kommt auch Rat. Ich hoffe bloß allzu lang lässts net auf sich warten

Re: Einfache for-Schleife will nicht so ganz :(
Verfasst: Mittwoch 12. August 2020, 19:04
von maowmaow
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
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")