for schleife bei list in list

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
kannickel
User
Beiträge: 6
Registriert: Freitag 13. Oktober 2017, 23:35

Hallo zusammen

ich habe ein Problem die Liste "zahlen= [[2,3,4],[2,44,5,6,77],[9,8,7,6,55]]" mit verschiedene Größen ordentlich auszugeben, wenn die inneren Listen verschieden Größen hat.

Mit len(zahlen) bekomme ich ja die Anzahl der Listen die in der Liste zahlen drin sind. Wie bekomme ich jetzt zb die Größe der inneren Liste [2,44,5,6,77] ?
Und wie kann ich die Liste mit einer for schleife herausgeben?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@kannickel: bei der Programmierung versuchst man immer ein komplexes Problem auf einfachere Probleme zurückzuführen. Wie würdest Du eine einfache Liste mit Zahlen ausgeben? Wie würdest Du eine Operation auf ein einzelnen Element auf eine Liste mit Elementen anwenden?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das Vorgehen lautet:
Für jede innere Liste in äußere Liste -> Gib Länge der jeweiligen inneren Liste

for und len() kennst du ja bereits. Jetzt musst du beides entsprechend kombinieren.
Für die Ausgabe könntest du erstmal print() benutzen. Danach kannst du überlegen ob man das für den internen Gebrauch sinnvoller lösen kann...
kannickel
User
Beiträge: 6
Registriert: Freitag 13. Oktober 2017, 23:35

Also um die liste auszugeben, benutze ich den code:

Code: Alles auswählen

for i in range(len(zahlen)):
	print(zahlen[i])

Und um die Größe von der innere Liste zu bekommen würde ich sowas in der Art versuchen:

print(len(zahlen[0][0]))

mit for schleife:

Code: Alles auswählen

for i in range(len(zahlen)):
	for y in range(len(zahlen[i][y]):
		print(zahlen[i][y])
Aber leider bekomme ich nur eine Fehlermeldung : TypeError: object of type 'int' has no len()
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gewoehn dir am besten gar nicht erst an in Python beim iterieren ueber Listen (oder anderen Sequenzen) das Pattern "for i in range(len(sequenz))" zu nutzen.

Python legt einen starken Fokus auf Iteration, und ueber eine Liste iteriert man so:

Code: Alles auswählen

for item in liste:
     ...
Wenn man dazu den Index noch braucht aus welchem Grund auch immer benutzt man enumerate:

Code: Alles auswählen

for i, item in enumerate(liste):
    ...
Der Vorteil ist, das diese Methode auch funktionert, wenn man etwas aufzaehlbares hat, das aber nicht ueber einen Index ansprechbar ist. Zeilen in einer Datei zB.

Und dann hast du auch gleich eine Unter-Liste, mit der du genauso weiterarbeiten kannst.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@kannickel: die Fehlermeldung sollte eigentlich heißen, dass y noch nicht definiert ist. Iteriert man direkt über Listen, können solche Fehler aber gleich gar nicht auftauchen:

Code: Alles auswählen

for zeile in zahlen:
    for zahl in zeile:
        print(zahl)
Ürigens wird immer mit 4 Leerzeichen pro Ebene eingerückt, nicht mit 3.
kannickel
User
Beiträge: 6
Registriert: Freitag 13. Oktober 2017, 23:35

Danke für die Hilfe.

Genau das Beispiel habe ich gesucht.

Code: Alles auswählen

for zeile in zahlen:
    for zahl in zeile:
        print(zahl)
Das mit enumerate schaue ich mir gleich nochmal richtig an, bzw die komplette for Schleife. Es ist doch etwas anders als in c++.

Aber wie bekomme ich die Größe der verschachteltet Liste ?


Und wie macht ihr den Code farbig ?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Groesse der Liste gibt's natuerlich nach wie vor ueber len. Das aendert sich ja nicht, du musst ja nicht ueber die innere Liste laufen, wenn dich nur die Laenge interessiert.

Fuer den farbigen Code statt dem Knopf "Code" das Dropdown "Code auswaehlen" direkt hier ueber dem Editor-Fenster benutzen. Da musst du natuerlich Python auswaehlen.
kannickel
User
Beiträge: 6
Registriert: Freitag 13. Oktober 2017, 23:35

So habe auch mein letztes Problem gelöst.

Bestimmung der Größe von den inneren Listen:

Code: Alles auswählen

for zeile in zahlen:
    print(len(zeile))

Danke für die Hilfe
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Da Python ein faible für Listen (Sequenzen im weitesten Sinne) hat, gibt es eine Reihe von Hilfmitteln zum Arbeiten mit eben diesen Listen:

[codebox=pycon file=Unbenannt.txt]>>> import itertools
>>> xss = [[2, 3, 4], [2, 44, 5, 6, 77], [9, 8, 7, 6, 55]]
>>> for x in itertools.chain.from_iterable(xss):
... print(x, end=' ')
...
2 3 4 2 44 5 6 77 9 8 7 6 55 >>>[/code]

Das mag Dir im Moment nicht wirklich weiterhelfen, da Du das Beispiel im Detail nicht nachvollziehen kannst. Behalte es aber im Hinterkopf, dass es Lösungen zu Problemen gibt, welche mit "antikem" Wissen (Iterieren über Index) nur umständlich gelöst werden können.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
kannickel
User
Beiträge: 6
Registriert: Freitag 13. Oktober 2017, 23:35

Noch ein kleine Frage. Bei meine Übung von "automate the boring stuff: table printer" habe ich die Aufgabe wie folgt gelöst:


Ich finde in der in den Listen das Größte Wort und speicher es dann in colWidths ab.

Code: Alles auswählen

tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]

colWidths = [0] * len(tableData)

for i in range(len(tableData)):
    for l in tableData[i]:
        if len(l) >= colWidths[i]:
            colWidths[i] = len(l)

print(colWidths)

Kann ich das mit der for schleife anders machen? Weil ich "for i in range(len(sequenz))" Pattern vermeiden soll.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

kannickel hat geschrieben:Kann ich das mit der for schleife anders machen? Weil ich "for i in range(len(sequenz))" Pattern vermeiden soll.

Code: Alles auswählen

tabledata = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]

print([max(len(item) for item in column) for column in tabledata])
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Probier das doch einfach aus. Und warum denkst du, es koennte hier *nicht* gehen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@kbr: gerade falschrum. Du hast jetzt die Maximale Länge pro Zeile und nicht pro Spalte.

Code: Alles auswählen

column_widths = [len(max(column, key=len)) for column in zip(*tabledata)]
kannickel
User
Beiträge: 6
Registriert: Freitag 13. Oktober 2017, 23:35

@__deets__ ich habe mehrer Variation versucht aber immer diesen Fehler bekommen:

TypeError: list indices must be integers or slices, not list

Deswegen habe ich ja die Index Methode mit range(len) benutzt.
Wollte nur wissen ob es eine bessere Methode gibt, sowie:

Code: Alles auswählen

print([max(len(item) for item in column) for column in tabledata])
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Sirius3: Laut Herangehensweise des OPs handelt es sich um eine Liste von Spalten.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@kbr: sorry, bei der komplizierten Schreibweise hatte ich gedacht, da müßte mehr dahinter sein.
Antworten