Ausschneiden aus Liste/Vektor - zweiter Index

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
kpot
User
Beiträge: 4
Registriert: Donnerstag 20. Februar 2020, 13:55

Hallo:
Ich arbeite mich (wieder, nach längerer Zeit) in Python-3 ein.
Zu folgendem Code hätte ich keine Verständnisfrage, sondern eine Frage, WARUM man die Bedeutung des zweiten Index so seltsam gewählt hat:

Der Code:
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
y = x[3 : 6] # WARUM muss man hier einen um 1 höheren Wert angeben ???
print(x)
print(y)
Die Ausgabe:
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
['d', 'e', 'f']

1) Ich will die Buchstaben d, e und f ausschneiden und der Variablen y zuweisen.
2) Da die Indexzählung mit 0 beginnt, muss logischerweise der erste Index 3 lauten. Soweit so gut und alles klar.
3) ABER: Der Index für den Buchstaben f ist nun ja 5 (fünf). Im Code muss aber 6 angegeben werden. # Intuitiv hätte ich erwartet, [3 : 5] schreiben zu müssen.

Meine Gretchenfrage:
Weiß irgend Jemand, warum das in Python so (seltsam) implementiert wurde ???
Mir scheint das nicht besonders intuitiv zu sein (insbesondere, wenn ich es mit anderen Programmiersprachen vergleiche).
Die Implementierer müssen sich dabei ja irgend etwas gedacht haben - und das hätte ich gerne gewusst, welchen besonderen Zweck man damit erreichen wollte.

In Lehrbüchern findet man bei solchen Beispielen z.B. folgenden Code:
y = x[3:6] # Erster Index ist inklusive, zweiter Index ist exklusive zu verstehen.

Mit freundlichen Grüßen
kurt
# Würde mich über jede plausible Antwort freuen.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Inituition ist für jeden etwas anderes.

https://www.xkcd.com/163/

http://www.cs.utexas.edu/users/EWD/tran ... WD831.html

Zusammengefasst: es läuft auf die Frage hinaus, wie man eine leeren Slice definieren will `x[3:3]`.
Zuletzt geändert von Sirius3 am Donnerstag 20. Februar 2020, 15:41, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Indizes kann man sich konzeptionell als die Positionen ZWISCHEN den Elementen vorstellen. Also

Code: Alles auswählen

[   a,    b,   c,    d   ]
  0    1     2    3   4
Die sind also unter dieser Betrachtung nicht seltsam, sondern konsistent gewaehlt. Und so kannst du mit zwei Zahlen *JEDEN* Ausschnitt abdecken, ohne einen Sonderfall zu kreieren, den dein Vorgehen erzeugt: wie schneidest du denn ein leeres Stueck aus der Liste aus? Mit einem Bereich (i, i) ist das in Python darstellbar. Bei dir ist das aber gleich eine ein-Elementige Liste, du musst also (i, i, True) oder (i, i, False) oder aehnliches nutzen, um zu kommunizieren, dass etwas ein leerer Ausschnitt ist. Ein netter Nebeneffekt ist, dass Ende - Anfang immer die anzahl der Elemente liefert. Bei dir ist 3 - 3 == 0, und man muss also gedanklich eine 1 addieren.
kpot
User
Beiträge: 4
Registriert: Donnerstag 20. Februar 2020, 13:55

Hallo:

- ... es läuft auf die Frage hinaus, wie man eine leeren Slice definieren will `x[3:3]`.
- ... dass Ende - Anfang immer die anzahl der Elemente liefert. Bei dir ist 3 - 3 == 0, und man muss also gedanklich eine 1 addieren.

[b]Beide Antworten gefallen mir! [/b]Das wars auch schon wieder.
DANKE für den Denkanstoß - kurt
Antworten