Nummerierung der Liste

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
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Hey,

ich wollte mal eine Liste, nummeriert mit Zahlen, ausgeben. Habe dazu ne while und for schleife verwendet.

Code:

Code: Alles auswählen

liste = ["Fleisch", "Fisch", "Wein", "Wasser", "Bier"]
countList = len(liste)

i = 0

while i < countList: 
  for lebensmittel in liste:
    print(str(i) + " : " + lebensmittel)
    i += 1;
    
Dies funktioniert auch alles wie gewollt. Nur wenn ich nun bei der while schleife i <= verwende wird die ganze Liste nochmals ausgegeben. Das heißt bis zur Zahl 9. Aber warum ist das denn so?

Ich sag doch, dass während i ist kleiner oder gleich der Länge von der liste (5) sollen die Listenelemente mit der jeweiligen Zahl ausgegeben werden und i um 1 erhöht werden. Dann würde ich erwarten, dass es bei 5 abbricht.

Hoffe ihr könnt das mir erklären.

Moon
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

das macht man mit einer `for`-Schleife und `enumerate`:

Code: Alles auswählen

foods = ["Fleisch", "Fisch", "Wein", "Wasser", "Bier"]
for index, food in enumerate(food):
    print(f"{index}: {food}")
bzw. wenn du Python <= 3.5 benutzt, dann muss der `f`-String ersetzt werden:

Code: Alles auswählen

"{}: {}".format(index, food)
Warum die `while`-Schleife mit `<=` nicht funktioniert, wird klar, wenn du den Code einfach mal Anweisung für Anweisung durchgehst und dir dabei die Werte der einzelnen Variablen (`i` und `lebensmittel`) notierst.

Zur `while`-Schleife mit `<`: Wie oft wird diese Schleife durchlaufen?

Strings mit `+` zusammenbauen ist ein Anti-Pattern, dafür gibt es (wie gezeigt) String-Formatierung mittels `str.format` bzw. `f`-Strings. Das ist kürzer und wesentlich einfacher zu lesen, insbesondere wenn einzelne Werte keine Strings sind und bei `+` noch mit `str` in Strings umgewandelt werden müssen.

Allgemein gilt, dass man in Python so gut wie nie manuell einen Index hochzählt.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

So macht man das nicht.

Stattdessen verwendet man enumerate:

Code: Alles auswählen

for i, lebensmittel in enumerate(liste):
      print(i, lebensmittel)
Und wenn deine while-Schleife nicht zweimal durchlaufen werden soll, braucht es ja auch keine Schleife, oder? Das ganze rumgefuhrwerke mit dem Index kannst du auch nur in der for-Schleife machen (auch wenn man das, wie erwaehnt, nicht tut).
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Moon: Du hast zwei Schleifen. Schau Dir mal an, wann welche Schleife durchlaufen wird; wann wird die Abbruchbedingung geprüft?
Moon
User
Beiträge: 37
Registriert: Mittwoch 20. Dezember 2017, 15:21

Hey,

vielen Dank für die hilfreichen Erklärungen und Vorschläge dies besser umzusetzen.

Meine Idee dahinter dies so zu erstellen war, dass ich nicht wusste wie es sonst geht und weil ich ja eine Nummerierung der einzelnen Listwerte haben wollte. Nun habe ich mir überlegt was ich denn so brauche. Ich brauchte dafür eine Zahl welche bis zur Länge der Liste in der while-schleife hochgezählt wird und die dazugehörigen Listenwerte und eben die for-schleife um die Listenwerte mit der Zahl auszugeben.

enumerate() ist die Funktion dafür. Alles klar. Geht ja sehr einfach. Nummeriert für mich schon alle Listenwerte. Danke.

@narpfel:
Zur `while`-Schleife mit `<`: Wie oft wird diese Schleife durchlaufen?
Die while Schleife wird da 4 mal durchlaufen. Und bei hinzufügen des = zum Operator 5mal.

Der Index der List startet ja bei 0. Dann würde dies meiner Meinung nach nach dem 4 durchlaufen so aussehen:
0 : Lebensmittel1
1: Lebensmittel2
2: Lebensmittel3
3: Lebensmittel4

Dann würde eines fehlen. Und wenn man <= benutzt würde der 5.te Listenwert, der fehlende, meiner Ansicht nach ausgegeben werden:
0 : Lebensmittel1
1: Lebensmittel2
2: Lebensmittel3
3: Lebensmittel4
4: Lebensmittel5

Vielen Dank für den Tipp mit der Stringkonkation (strings verbinden). Werde ich mir aufjedenfall nochmal anschauen. Kannte die Verkettung der Strings bisher nur mit + oder .

@Sirius3:
Die Abbruchbedingung wird ja bei der while-schlefe geprüft ?

EDIT:
Habe noch etwas rumgetestet. Ich habe nicht richtig nachgedacht. Ich brauche ja garnicht die while-schleife dafür. Ich brauche lediglich i, die Liste und eine for-schleife. Die for-Schleife wird so lange durchlaufen, bis alle Listenwerte ausgegeben sind. Das heißt nach jeder Ausgabe eines Listenwertes startet die for-schleife ihren Durchgang neu. Somit kann ich ja nach jedem Durchgang i um 1 erhöhen und dann passt es.


Moon
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@Moon: Eventuell solltest du darüber nachdenken, mal das offizielle Python-Tutorial durchzuarbeiten. Da werden die Grundlagen der pythonischen Programmierung erläutert.
Antworten