Liste - Werden die Elemente in einer Zeile gespeichert, also "spaltenweise" oder untereinander, also "zeilenweise"?

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
PüthoniMüthoni
User
Beiträge: 3
Registriert: Dienstag 18. Juni 2024, 05:46

Hallo liebe Python-Community,

da ich ein kompletter Anfänger bin und auch dazu nichts genaues im Internet bzw. hier im Forum gefunden habe, möchte ich mein Verständnisproblem auflösen. Vielleicht verkompliziere ich das Thema, daher wäre mir eure Erfahrung sehr hilfreich.

Wenn ich eine Liste anlege, z.B. a = [1, 2, 3, 4, 5], werden die Elemente in einer einzigen Zeile abgespeichert? Wenn ja, ist dann Element 1 in Spalte 1, Element 2 in Spalte 2 usw. oder sind alle Elemente nur in einer einzigen Spalte?

Oder ist eine Liste, sowie ich mir eine Einkaufsliste vorstelle, untereinander, also zeilenweise aufgeschrieben? Element 1 in Zeile 1, Element 2 in Zeile 2 usw.?

Wo ist mein Denkfehler bzw. die falsche Vorstellung von Listen?


Wäre über jeden hilfreichen Tipp dankbar!

Liebe Grüße
Benutzeravatar
Kebap
User
Beiträge: 776
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Es ist egal, ob du die Liste wagerecht oder senkrecht hältst. Das mit Zeilen und Spalten zu vergleichen, führt nicht zum Ziel. Wichtig ist bei Listen nur die Reihenfolge. Nicht aber die Orientierung im Raum.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Liste ist weder spaltenweise noch zeilenweise. Die Elemente haben nur eine Ordnung in Bezug auf ihren Index. Das ist etwas ganz abstraktes, man darf das nicht mit einer Tabelle vergleichen.
Warum wäre es für Dich wichtig, zu wissen, ob das Zeilen oder Spalten sind?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PüthoniMüthoni: Wo sollen denn diese Zeilen und/oder Spalten sein von denen Du sprichst? Und wofür brauchst Du diese Information?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
PüthoniMüthoni
User
Beiträge: 3
Registriert: Dienstag 18. Juni 2024, 05:46

Danke für die Antworten!

Sehr interessant, dass Listen weder in Spalten oder Zeilen zu verstehen sind. Also kann ich mir eine Liste wie eine Box vorstellen, die ich mit "Werten" befüllen kann und jeder dieser Werte hat einen Index. Demzufolge wäre eine Liste in einer Liste eine kleinere Box in der großen Box?

Die Frage kommt zustande, weil ich mich grad an dem Tic Tac Toe Spiel versuche und verstehen wollte wie durch Liste in Liste das Spielfeld zustande kommt. Das war mir nicht ganz verständlich. Ich dachte, dass Listen spalten- bzw. zeilenweise dargestellt werden. Durch die 3 x 3 Darstellung denkt man als Anfänger, dass es so wäre. Trugschluss... :D
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PüthoniMüthoni: Es gibt da halt keine Zeilen und Spalten, das sind Konzepte die sich der Mensch vor dem Rechner dazu vorstellt. Und ob bei einem Spielfeld mit verschachtelten Listen beispielsweise die inneren Listen die Zeilen oder die Spalten repräsentieren, entscheidet der Programmierer in dem er die Werte eben entweder als Zeilenwerte oder als Spaltenwerte behandelt. Das geht ja beides.

Das Bild mit den Schachteln hat auch so seine Grenzen, denn in der Realität kann man die selbe Schachtel nicht mehrfach in den selben Behälter stecken. Oder gar eine Schachtel in sich selbst. Und Gross und Klein ist auch eventuell irreführend, denn die Grösse ist ja die Anzahl der Elemente, und man viel grössere Listen in eine sehr kleine Liste stecken. Im Tic Tac Toe Beispiel sind alle Listen gleich gross, denn da haben alle Liste die Länge 3.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
PüthoniMüthoni
User
Beiträge: 3
Registriert: Dienstag 18. Juni 2024, 05:46

Vielen lieben Dank für deine Antwort!
__blackjack__ hat geschrieben: Mittwoch 19. Juni 2024, 13:19 Und ob bei einem Spielfeld mit verschachtelten Listen beispielsweise die inneren Listen die Zeilen oder die Spalten repräsentieren, entscheidet der Programmierer in dem er die Werte eben entweder als Zeilenwerte oder als Spaltenwerte behandelt. Das geht ja beides.
Die Darstellung einer Liste in Zeilen oder in Spalten hab ich entweder noch nicht gesehen oder schon wieder vergessen :D
Es gibt wahrscheinlich mehrere Varianten. Soweit ich weiß, gibt mir die Print-Funktion die Elemente einer Liste zeilenweise aus.
Man könnte auch nach jedem Element mit der .join-Funktion ein \n einfügen, was ebenfalls die einzelnen Elemente zeilenweise ausgeben würde.

Wie würde ich das machen, wenn ich die Liste als Spalte darstellen möchte?

__blackjack__ hat geschrieben: Mittwoch 19. Juni 2024, 13:19 Das Bild mit den Schachteln hat auch so seine Grenzen, denn in der Realität kann man die selbe Schachtel nicht mehrfach in den selben Behälter stecken. Oder gar eine Schachtel in sich selbst. Und Gross und Klein ist auch eventuell irreführend, denn die Grösse ist ja die Anzahl der Elemente, und man viel grössere Listen in eine sehr kleine Liste stecken. Im Tic Tac Toe Beispiel sind alle Listen gleich gross, denn da haben alle Liste die Länge 3.
Ich verstehe! Also sollte ich sowohl hier bei Listen als auch bei anderen Konzepten viel abstrakter denken.
Nochmal vielen lieben Dank für deine Zeit und dein Wissen.

Liebe Grüße
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

PüthoniMüthoni hat geschrieben: Mittwoch 19. Juni 2024, 23:47 Wie würde ich das machen, wenn ich die Liste als Spalte darstellen möchte?
Meinst du so?

Code: Alles auswählen

columns = [["Rot", "Gelb", "Grün"], ["Kirsche", "Banane", "Salat"]]
for line_items in zip(*columns):
    print(*line_items, sep="\t")
Da wird es schon direkt etwas fortgeschrittener.

Du kannst ja als erstes mal nachschauen, was die zip()-Funktion macht und was der sep-Parameter bei print() bewirkt.

Die Sternchen sorgen dafür, dass ein Iterable (hier: eine Liste) in seine einzelnen Elemente aufgelöst wird. Somit übergibt z. B. nicht ``print([a, b, c])``, sondern ``print(a, b, c)``. Und bei zip() sorgt ``zip(*columns)`` für ``zip(columns[0], columns[1], ...)``.

Spiel gern damit herum: Lass mal den einen Stern und mal den anderen weg. Rufe zip() mal direkt mit verschiedenen Listen auf. Und was passiert eigentlich ohne dieses ``sep="\t"``...?

Weitere Faktoren: Was passiert, wenn man bei einer Spalte ein Element hinzufügt, aber bei der anderen nicht und sie somit unterschiedlich lang sind? Und was, wenn mindestens eins der Farbwörter deutlich länger ist als im Beispiel, etwa "Himmelblau"?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PüthoniMüthoni: `print()` alleine gibt Listen weder Zeilen- noch Spaltenweise aus. Das fragt die Liste einfach nach ihrer Repräsentation als Zeichenkette und das ist "[" gefolgt von den `repr()`-Repräsentationen der einzelnen Listeelemente durch Kommas getrennt, mit einem "]" abgeschlossen. Wenn man es selber programmieren würde, also vereinfacht so etwas:

Code: Alles auswählen

def list_as_string(items):
    return "[" + ", ".join(repr(item) for item in items) + "]"
Listen übernehmen bei `str()` einfach das Verhalten von `object`, das heisst ``str(a_list)`` liefert das gleiche Ergebnis wie ``repr(a_list)``. Das heisst wenn ein Element in der Liste selbst eine Liste ist, dann passiert das gleiche wie in `list_as_string()` mit diesem Element.

Wenn man also eine ”2D-Liste” als Liste von Zeilen auffassen und so ausgeben möchte, dann muss man schon selbst eine Schleife schreiben, welche die einzelnen Unterlisten jeweils in einer Zeile ausgibt. Die Unterlisten als Zeilen zu sehen ist vom Code her einfacher wenn man das als Text auf einem ”seriellen” Terminal ausgeben möchte, weil die so in Zeilen und Spalten organisiert sind, das aufeinanderfolgende Ausgaben erst einmal eine Zeile füllen und dann durch ”Überlauf” oder ein Zeilenende-Steuerzeichen in der nächsten Zeile fortgesetzt wird.

Andererseits kann es Probleme geben wo der Code einfacher wird wenn man die Unterlisten als Spalten auffasst.

Bei Tic Tac Toe ist es von der Programmlogik eigentlich egal, denn dort muss man auf Zeilen und Spalten operieren, das heisst eine ”Richtung” ist immer etwas einfacher zu addressieren als die andere. Für die Ausgabe auf dem Terminal ist es aber wie gesagt einfacher wenn die Unterlisten die Zeilen darstellen, darum ist *das* dann üblicherweise die Interpretation der Datenstruktur die man wählt.

Man könnte auch nur *eine* Liste verwenden wo die Elemente zeilenweise nacheinander enthalten sind und bei der Ausgabe entsprechend dem Index des Listenelements einen Zeilenumbruch ausgeben:

Code: Alles auswählen

    items = list(range(9))
    for i, item in enumerate(items):
        if i and i % 3 == 0:
            print()
        print(item, end=" ")
    print()
Ausgabe:

Code: Alles auswählen

0 1 2
3 4 5
6 7 8
Man kann die gleiche Liste aber auch so interpretieren das dort die Spalten nacheinander gespeichert sind. Ausgabecode:

Code: Alles auswählen

    items = list(range(9))
    for i in range(3):
        for j in range(3):
            print(items[i + j * 3], end=" ")
        print()
    print()
Ausgabe:

Code: Alles auswählen

0 3 6
1 4 7
2 5 8
Man könnte auch jede Zeile in einer einzigen Zahl kodieren (die maximal 6 Bits braucht):

Code: Alles auswählen

    symbols = "-XO"
    rows = [22, 36, 16]
    for row in rows:
        for _ in range(3):
            print(symbols[row & 0b11], end=" ")
            row >>= 2
        print()
Ausgabe:

Code: Alles auswählen

O X X 
- X O 
- - X
Mit entsprechendem Code können die Zahlen aber auch für die Spalten stehen.

Man kann auch das ganze Feld in einer einzigen Zahl kodieren. Nach dem Muster aus dem letzten Beispiel bräuchte man dafür dann maximal 18 Bits. Aber auch das ginge noch kompakter, denn die 19.683 Möglichkeiten die 9 Felder mit nichts, einem X oder einem O zu belegen kann man auch in 15 Bit speichern. Das gleiche Spielfeld wie im letzen Code-Schnippsel:

Code: Alles auswählen

symbols = "-XO"
    remainder = 7145
    for i in range(9):
        remainder, index = divmod(remainder, 3)
        if i and i % 3 == 0:
            print()
        print(symbols[index], end=" ")
    print()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten