Zweidimensionale Liste auslesen

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
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Hallo zusammen,

ich habe vor einigen Jahren etwas mit Python programmiert, was aber schnell wieder eingeschlafen ist (wie das halt so ist, wenn man etwas nur macht, weil man es muss...). Seitdem hauptsächlich C(++, #), aber nur so für den "Hausgebrauch". Jetzt will ich aber in Python einsteigen weil ich es will und es daher vernünftig lernen. Also wirklich in Python programmieren und nicht Python im C-Style. Mal gucken wie lange ich das durchhalte :wink:

Zu Beginn habe ich gelesen, wie einfach man mit Arrays bzw. Listen arbeiten kann. Daher wollte ich eine einfache zweidimensionale Liste anlegen und auslesen. Mein erster naiver Ansatz sah so aus:

Code: Alles auswählen

lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("Erste Zeile: " + str(lst[0][:]))
print("Erste Spalte: " + str(lst[:][0]))
Als Ausgabe erhalte ich:
Erste Zeile: [1, 2, 3]
Erste Spalte: [1, 2, 3]

Wieso erhalte ich für die erste Spalte die selben Werte wie für die erste Zeile?

Mittlerweile weiß ich, dass ich die Spalte mit

Code: Alles auswählen

print([column[0] for column in lst])
auslesen kann. Aber das Ergebnis beim Versuch vorher ist mir noch ein Rätsel.
Daher fände ich es sehr nett, wenn mir jemand auf die Sprünge helfen oder mir sagen könnte wo ich das nachlesen kann.

Danke schön
BlackJack

@Zizibee: Warum genau ist Dir das denn ein Rätsel? Was denkst Du was ``a_list[0]`` und ``a_list[:]`` bedeutet? An welcher Stelle hättest Du ein anderes Zwischenergebnis erwartet als Du tatsächlich bekommst? Und warum? An dieser Stelle ist eine Python-Shell sehr hilfreich um so einfache Sachen einfach mal auszuprobieren.

Code: Alles auswählen

In [8]: lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [9]: lst[0]
Out[9]: [1, 2, 3]

In [10]: lst[0][:]
Out[10]: [1, 2, 3]

In [11]: lst[:]
Out[11]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [12]: lst[:][0]
Out[12]: [1, 2, 3]
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Hallo BlackJack,

danke schon einmal für die Antwort!

Bisher hatte ich das so verstanden:
``a_list[0]`` sollte das erste Element ausgeben und
``a_list[:]`` alle Elemente

Ich hätte gedacht, dass

Code: Alles auswählen

lst[:][0]
so viel bedeutet wie:
[:] -> nehme jede 3er-Liste (also [1, 2, 3], [4, 5, 6] und [7, 8, 9])
[0] -> von jeder dieser Listen das erste Element (also 1, 4 und 7)
Oder als Tabelle ausgedrückt: von jeder Zeile die erste Spalte.

Aber es ist wohl eher so(?):
lst[0] -> das erste Element (hier: [1, 2, 3])
lst[0][:] -> das gesamte erste Element (hier also wieder [1, 2, 3])
lst[:][0] -> von der gesamten Liste das erste Element (also wie lst[0])

Kommt das so hin?
BlackJack

@Zizibee: ``a_list[:]`` bedeutet eine (flache) Kopie der Liste und macht gegenüber einfach nur ``a_list`` nur Sinn wenn man tatsächlich eine (flache) Kopie der Liste haben möchte. Vom Effekt her ist ein kompletter „slice“ so ähnlich wie `System.Array.Clone()` in C#.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

@BlackJack: Wieder was dazu gelernt, danke schön :)
BlackJack

In C# wäre das ungefähr das hier:
[codebox=csharp file=Unbenannt.cs] uint[][] xs = {
new uint[] {1, 2, 3}, new uint[] {4, 5, 6}, new uint[] {7, 8, 9}
};
Console.WriteLine("[{0}]", string.Join(", ", (uint[]) xs[0].Clone()));
Console.WriteLine("[{0}]", string.Join(", ", ((uint[][]) xs.Clone())[0]));[/code]
Antworten