Listen Index Verständnisfrage zu [start:ende]

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
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Hallo,

eine Anfänger Verständnisfrage:
Listenindex für das erste Element ist [0].
Bei Kofler "Python Der Grundkurs" wird erklärt, das die Startposition inklusive und die Endposition aber exklusive ist [start:ende].

Code: Alles auswählen

Liste = ["A", "B", "C", "D"]
Liste = [1:2]   # ["B"]
Warum hat man das Prinzip für Startposition und Endposition unterschiedlich festgelegt?
Warum für Startposition und Endposition nicht beide inklusive?
Also so:

Code: Alles auswählen

Liste = ["A", "B", "C", "D"]
Liste = [1:2]   # ["B","C"]
Wenn man sagt: Listenindex für das erste Element ist [0]. Müsste man doch eigentlich hinzufügen, dass dies bei [start:ende] nur für die Startposition gilt. Für die Endposition (ende) gilt [1].
Das verwirrt mich. :?
Zuletzt geändert von Fiffio am Montag 11. März 2019, 16:04, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Donald Knuth hat das mal schön hergeleitet, ich finde nur nicht mehr seinen Artikel. (Der ist es nicht: https://xkcd.com/163/)
Hier eine abgeleitete Abhandlung des Themas: https://news.ycombinator.com/item?id=6601515
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Ja, der 2. Link hilft weiter. :)
"I (0-indexing) think of them as the following:"

Code: Alles auswählen

      |-|-|-|...|-|
      ^           ^
    first   past-the-end
   position
   
      |-|-|-|...|-|
       ^         ^
    first      last
   element    element
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Fiffio hat geschrieben: Montag 11. März 2019, 15:34 Bei Kofler "Python Der Grundkurs" wird erklärt, das die Startposition inklusive und die Endposition aber exklusive ist [start:ende].

Code: Alles auswählen

Liste = ["A", "B", "C", "D"]
Liste = [1:2]   # ["B"]
Warum hat man das Prinzip für Startposition und Endposition unterschiedlich festgelegt?
Wenn du Teilbereiche nimmst bekommst du nichts doppelt.

Code: Alles auswählen

>>> data = ['a', 'b', 'c', 'd']
>>> result = data[0:2] + data[2:4]
>>> result
['a', 'b', 'c', 'd']
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

/me hat geschrieben: Montag 11. März 2019, 16:26 Wenn du Teilbereiche nimmst bekommst du nichts doppelt.

Code: Alles auswählen

>>> data = ['a', 'b', 'c', 'd']
>>> result = data[0:2] + data[2:4]
>>> result
['a', 'b', 'c', 'd']
Ja, aber es gibt keinen Index Nr. 4.

Code: Alles auswählen

    print(result[4])

IndexError: list index out of range
Und wenn man brav gelernt hat "Listenindex für das erste Element ist [0]", dann ist der Anfänger irritiert, wenn plötzlich eine Zahl in den eckigen Klammern auftaucht, die im Index nicht existiert. Aber jetzt ist es mir verständlicher, weil für Startposition und Endposition [start:ende] unterschiedliche Regeln gelten.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Falsch gedacht. Es existieren verschiedene Regeln für Indexzugriff und Bereiche (Slices)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Etwas weniger Hirnschmalz braucht es übrigens, wenn Slicing unmittelbar den Anfang oder das Ende mit einbezieht. Denn dann kann man die Endposition weglassen und es liest sich somit etwas leichter. Diese Situation hat man nicht immer, aber häufig.

Ausgabe aus der Python-Shell:

Code: Alles auswählen

>>> 'foobar'[:3]  # Die ersten 3
'foo'
>>> 'foobar'[-3:]  # Die letzten 3
'bar'
In anderen Fällen muss man leider damit leben, dass sozusagen um eins versetzt gedacht werden muss...
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

snafu hat geschrieben: Dienstag 12. März 2019, 04:08 In anderen Fällen muss man leider damit leben, dass sozusagen um eins versetzt gedacht werden muss...
und manchmal hilft es auch in anderen Bereichen des Lebens "um eins versetzt" zu denken ..... :geek: :D :lol:
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten