Verständnisfrage zu verschachtelten 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
nobbe75
User
Beiträge: 9
Registriert: Donnerstag 13. März 2014, 14:30

Hallo, ich bin gerade dabei Python zu lernen und kann mir folgendes nicht erklären. Ich möchte mit Hilfe einer Schleife aus einer verschachtelten Liste die Länge der Elemente ausgeben. Funktioniert soweit, aber den letzten Wert kann ich mir nicht erklären. Erst einmal der Code

Code: Alles auswählen

zeug = ["spam!", 1, ["bla", "bla bla", "nochmehr bla"], [2, 3, 4]]
i  = 0
while i < len(zeug):
        print len(str(zeug[i]))
        i = i + 1
Als Ergebnis bekomme ich:
5
1
30
9

Warum bekomme ich als letzten Wert 9? Setze ich die Zahlen in " " bekomme ich als Ergebnis 11. Leider habe und finde ich bisher keine Erklärung dafür.

Kann mir das jemand bitte erklären?

Grüße
Nobbe
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Weil der String "[2, 3, 4]" genau 9 Zeichen lang ist. Nichts anderes macht dein print-Statement: erst wandelst du den Wert in einen String um und davon berechnest du dann die Länge.

Deine while-Schleife ist übrigens grausam, du kannst direkt über die Elemente von Listen iterieren:

Code: Alles auswählen

for element in zeug:
    print element
Das Leben ist wie ein Tennisball.
karolus
User
Beiträge: 145
Registriert: Samstag 22. August 2009, 22:34

Code: Alles auswählen

In [5]: str([2,3,4])
Out[5]: '[2, 3, 4]'
Karolus
nobbe75
User
Beiträge: 9
Registriert: Donnerstag 13. März 2014, 14:30

Logisch, ist mir nicht weiter aufgefallen, da ich die Zeichen des dritten Elements nicht nachgezählt hatte, die stimmen dann ja natürlich auch nicht. Das mit dem String habe ich nur gemacht, weil len mit der Zahl nichts anfangen kann.
Deine while-Schleife ist übrigens grausam, du kannst direkt über die Elemente von Listen iterieren:

Code: Alles auswählen

for element in zeug:
    print element
Kann schon sein, ich lerne ja noch und da geht es mir um die Grundfunktionen (in dem Fall mehr um while als um die Liste). Entwickeln will man sich ja dabei auch noch, also danke für den Hinweis, aber das gibt mir aber nur die Elemente aus, ich wollte sie eigentlich zählen.

Viele Grüße
Nobbe
BlackJack

@nobbe75: Natürlich gibt das nur die Elemente aus. Aber anstelle des ``print`` kannst Du ja das schreiben was Du in Deiner ``while``-Schleife mit dem `element` angefangen hättest.

Das Problem was Du hier mit Umwandlung in Zeichenketten zu umgehen versucht hast, ist das Mischen von verschiedenen Datentypen in einer Liste. Das sollte man nicht tun, weil das zu genau diesen Problemen führt. Elemente in Listen sollten in der Regel vom gleichen „duck type” sein, wenn Du also die Länge von den Elementen ermitteln möchtest, dann sollten da auch nur Elemente drin sein, die auch eine Länge haben.

Edit: Vorschlag wie man mit dem Problem besser umgehen kann:

Code: Alles auswählen

#!/usr/bin/env python


def main():
    stuff = ['spam!', 1, ['bla', 'bla bla', 'nochmehr bla'], [2, 3, 4]]
    for item in stuff:
        try:
            length = len(item)
        except TypeError:
            print '{0!r} has no length.'.format(item)
        else:
            print 'The length of {0!r} is {1}.'.format(item, length)


if __name__ == '__main__':
    main()
nobbe75
User
Beiträge: 9
Registriert: Donnerstag 13. März 2014, 14:30

OK, vielen Dank an alle.

Was ich daraus gelernt habe, nach Wichtigkeit sortiert:
1. Das mischen von Datentypen sollte man vermeiden, dies war der eigentliche Auslöser für meine daraus resultierenden Problem. Danke an BlackJack

2. str() wandelt meine ganze Liste in einen String auch die Begrenzungszeichen für meine verschachtelte Liste, daher die für mich zunächst nicht nachvollziehbare Ausgabe der merkwürdigen 9. Danke an EyDu und karolus

3. Die Lösung ist nicht optimal, aber ich stehe noch am Anfang und wenn ich mir die Grundlagen erarbeitet habe, dann werde ich mich nicht ausruhen sondern daran arbeiten einen besseren Code zu schreiben. Das heißt ihr werdet bald wieder von mir hören. :roll:

Viele Grüße

Nobbe

PS: Gibt es hier ein Möglichkeit den Beitrag auf gelöst zu stellen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

nobbe75 hat geschrieben:PS: Gibt es hier ein Möglichkeit den Beitrag auf gelöst zu stellen?
Nein, mit Absicht nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten