Seite 1 von 1

for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 09:41
von kannickel
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?

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 10:19
von Sirius3
@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?

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 10:29
von snafu
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...

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 10:59
von kannickel
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()

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 11:14
von __deets__
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.

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 12:21
von Sirius3
@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.

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 13:37
von kannickel
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 ?

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 13:55
von __deets__
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.

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 15:06
von kannickel
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

Re: for schleife bei list in list

Verfasst: Mittwoch 18. Oktober 2017, 19:47
von bwbg
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.

Re: for schleife bei list in list

Verfasst: Donnerstag 19. Oktober 2017, 12:39
von kannickel
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.

Re: for schleife bei list in list

Verfasst: Donnerstag 19. Oktober 2017, 13:09
von kbr
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])

Re: for schleife bei list in list

Verfasst: Donnerstag 19. Oktober 2017, 13:09
von __deets__
Probier das doch einfach aus. Und warum denkst du, es koennte hier *nicht* gehen?

Re: for schleife bei list in list

Verfasst: Donnerstag 19. Oktober 2017, 13:34
von Sirius3
@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)]

Re: for schleife bei list in list

Verfasst: Donnerstag 19. Oktober 2017, 13:42
von kannickel
@__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])

Re: for schleife bei list in list

Verfasst: Donnerstag 19. Oktober 2017, 15:45
von kbr
@Sirius3: Laut Herangehensweise des OPs handelt es sich um eine Liste von Spalten.

Re: for schleife bei list in list

Verfasst: Donnerstag 19. Oktober 2017, 16:33
von Sirius3
@kbr: sorry, bei der komplizierten Schreibweise hatte ich gedacht, da müßte mehr dahinter sein.