Python Listen Indizes

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
nudgegoonies
Beiträge: 939
Registriert: 16.02.2009 09:35:10

Python Listen Indizes

Beitrag von nudgegoonies » 29.04.2017 12:27:57

Ich lerne gerade etwas Python und die Listenverarbeitung irritiert mich gerade. Warum das erste Element 0 ist, wie auch in vielen anderen Programmiersprachen, ist mir natürlich klar (Speicheradressierung).

Mit negativen Indizes die Elemente vom Ende der Liste aus zu adressieren finde ich geschickt. Allerdings hat, und das ist jetzt völlig inkonsistent, das letzte Element den Index -1 statt -0.

Natürlich gibt es -0 mathematisch gar nicht und es gibt somit auch keine Integer Repräsentation von -0. Aber da hätte ich gedacht, dass der Python Interpreter am - erkennt, dass ich auf das Ende der Liste zugreifen will. Er sieht den Index aber als Vorzeichen behafteten Integer.

Da das Minus also immer als Vorzeichen interpretiert wird hätte ich mir an der Stelle lieber eine andere Index-Signatur für die Liste von hinten gewünscht, die genauso Null basiert ist als wenn man die Liste von vorne durchläuft. Gibt es so etwas?
Soft: Bullseye AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon R7 360 MESA.
Hardware: Thinkstation S20, Intel X58, 16GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HDS und DVD+RW.

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Python Listen Indizes

Beitrag von cronoik » 29.04.2017 15:00:55

Ich kenne Python nicht so gut, aber bestimmt laesst sich da etwas ueberschreiben [1]. Allerdings solltest du dir die Frage stellen, was du den Lesern deines Skriptes zumutest :)

[1] http://stackoverflow.com/questions/1603 ... ived-class
[2] http://stackoverflow.com/questions/1957 ... e-operator
Hilf mit unser Wiki zu verbessern!

Liffi
Beiträge: 2306
Registriert: 02.10.2004 01:33:05

Re: Python Listen Indizes

Beitrag von Liffi » 29.04.2017 15:36:50

nudgegoonies hat geschrieben: Natürlich gibt es -0 mathematisch gar nicht und es gibt somit auch keine Integer Repräsentation von -0. Aber da hätte ich gedacht, dass der Python Interpreter am - erkennt, dass ich auf das Ende der Liste zugreifen will. Er sieht den Index aber als Vorzeichen behafteten Integer.
Das wird gar nicht so einfach. -0 hinschreiben geht ja noch. Aber wie machst du das programmatisch? Nehmen wir an, du subtrahierst zwei Zahlen um den Index herauszufinden. Wann wird die negative, wann die positive 0 genommen?
Vielleicht hilft dir auch folgendes Diagramm.

Code: Alles auswählen

 +---+---+---+---+---+
 | H | e | l | l | o |
 +---+---+---+---+---+
 0   1   2   3   4   5
-5  -4  -3  -2  -1
Hier sieht man, warum die -1 auch Sinn ergibt.

Python dazu:
One way to remember how slices work is to think of the indices as pointing between characters, with the left edge of the first character numbered 0.
Zuletzt geändert von Liffi am 29.04.2017 16:12:34, insgesamt 1-mal geändert.

DeletedUserReAsG

Re: Python Listen Indizes

Beitrag von DeletedUserReAsG » 29.04.2017 16:06:03

Eigentlich ist’s mit den negativen Indices logisch, alles Andere würde unbeteiligte Entwickler nur verwirren. Aber wenn man drauf besteht, könnte man sich sicher was aus ’nem Dictionary zurechtschnitzen ….

Benutzeravatar
jph
Beiträge: 1049
Registriert: 06.12.2015 15:06:07
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Greven/Westf.

Re: Python Listen Indizes

Beitrag von jph » 29.04.2017 16:15:09

nudgegoonies hat geschrieben:Natürlich gibt es -0 mathematisch gar nicht und es gibt somit auch keine Integer Repräsentation von -0?
0 ist vorzeichenlos. +0 gibt es genauso wenig wie -0.

ChronoBoost
Beiträge: 140
Registriert: 29.01.2013 11:03:50

Re: Python Listen Indizes

Beitrag von ChronoBoost » 29.04.2017 17:08:19

jph hat geschrieben:
nudgegoonies hat geschrieben:Natürlich gibt es -0 mathematisch gar nicht und es gibt somit auch keine Integer Repräsentation von -0?
0 ist vorzeichenlos. +0 gibt es genauso wenig wie -0.
Mathematisch mag das stimmen, in der IEEE 754 Repräsentation gibt es aber sowohl -0.0 als auch +0.0. Daraus ließe sich mit __getitem__ bestimmt etwas basteln. Dazu raten würde ich aber trotzdem nicht.

Liffi
Beiträge: 2306
Registriert: 02.10.2004 01:33:05

Re: Python Listen Indizes

Beitrag von Liffi » 29.04.2017 17:10:46

ChronoBoost hat geschrieben: Mathematisch mag das stimmen, in der IEEE 754 Repräsentation gibt es aber sowohl -0.0 als auch +0.0. Daraus ließe sich mit __getitem__ bestimmt etwas basteln. Dazu raten würde ich aber trotzdem nicht.
Wobei das erstmal nicht wie Integer wirken. Und mit Fließkommazahlen als Indizes oder auch als Schlüssel in Dictionaries kommt man in die Hölle :-).

nudgegoonies
Beiträge: 939
Registriert: 16.02.2009 09:35:10

Re: Python Listen Indizes

Beitrag von nudgegoonies » 03.05.2017 21:07:49

Erst mal vielen Dank für alle eure Antworten :THX:
cronoik hat geschrieben:Ich kenne Python nicht so gut, aber bestimmt laesst sich da etwas ueberschreiben [1]. Allerdings solltest du dir die Frage stellen, was du den Lesern deines Skriptes zumutest :)
Das wäre in der Tat vom Grundsatz her schon verwirrend. Vor allem, da es sich um einen Standard in Python handelt.
Liffi hat geschrieben: Das wird gar nicht so einfach. -0 hinschreiben geht ja noch. Aber wie machst du das programmatisch? Nehmen wir an, du subtrahierst zwei Zahlen um den Index herauszufinden. Wann wird die negative, wann die positive 0 genommen?
Vergessen wir hier mal kurz das Minus. Rechnerei mit dem Index finde ich verwirrend, wenn durch das Vorzeichen des Ergebnisses festgelegt wird, dass Elemente von vorne oder von hinten aus der Liste genommen werden. Auch wenn es dafür sicher Anwendungsfälle gibt. Mir geht es eher darum, wie ich festlege, ob ich von vorne oder von hinten auf die Liste zugreife. Theoretisch sollte man die Zugriffsmethode, ob von vorne oder von hinten, anders festlegen. Dann könnte man vorwärts wie rückwärts vorzeichenlose Integer, und vor allem beide nullbasiert, benutzen. Meine Idee mit dem -0 war in der Hinsicht falsch, dass vorzeichenbehaftete Integer asymmetrisch abgelegt sind.

Dein Diagramm hat mir geholfen zu verstehen wie es in Python gedacht ist. In Hinblick auf die Asymetrie der Integer ist der Ansatz komplett logisch. Aber erwartungskonform ist er definitiv nicht. In allen Büchern über Programmiersprachen wird erklärt, warum Indizes immer mit 0 anfangen. Und beim Rückwärtszugriff in Python hat man dann schon die erste Ausnahme :wink:
ChronoBoost hat geschrieben:Mathematisch mag das stimmen, in der IEEE 754 Repräsentation gibt es aber sowohl -0.0 als auch +0.0. Daraus ließe sich mit __getitem__ bestimmt etwas basteln. Dazu raten würde ich aber trotzdem nicht.
Ich frage mich ob das Absicht war, die -0.0 auch zu definieren. Den Ansatz Fließkommazahlen als Indizes zu verwenden verstehe ich. Aber ich fürchte da gilt das selbe wie für das was cronoik geschrieben hat.
Soft: Bullseye AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon R7 360 MESA.
Hardware: Thinkstation S20, Intel X58, 16GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HDS und DVD+RW.

Benutzeravatar
TRex
Moderator
Beiträge: 8038
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Python Listen Indizes

Beitrag von TRex » 04.05.2017 07:37:12

Ganz besonders irrekreative Programmierer definieren sich Konstanten MINUS_NULL MINUS_EINS ff. und benutzen dann die beim Zugriff.


Edit: Bevor das einer falsch interpretiert: Man sollte sich mit der -1 abfinden. Obiges ist Schwachfug.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

nudgegoonies
Beiträge: 939
Registriert: 16.02.2009 09:35:10

Re: Python Listen Indizes

Beitrag von nudgegoonies » 04.05.2017 10:58:17

Ok, dann fasse ich mal zusammen:

Indizes mit 0 zu beginnen statt 1 hat in der Informatik historische Gründe aufgrund des Speicherzugriffs. Klingt blöd, ist aber so :facepalm:

Rückwärts-Indizes dann aber mit -1 zu beginnen hat in der Informatik technische Gründe aufgrund des Integer-Bitlayouts. Klingt blöd, ist aber so :facepalm:

Informatik ist wie Doppelkopf - es gibt mehr Ausnahmen als Regeln :wink:
Soft: Bullseye AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon R7 360 MESA.
Hardware: Thinkstation S20, Intel X58, 16GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HDS und DVD+RW.

DeletedUserReAsG

Re: Python Listen Indizes

Beitrag von DeletedUserReAsG » 04.05.2017 12:00:02

Ich finde das eigentlich perfekt logisch und kann mir zudem nicht recht vorstellen, wie man auf andere Weise sinnvoll damit rechnen sollte. 0 ist das erste Element, 1 also das Zweite und -1 das vor dem Ersten, also das Letzte.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Python Listen Indizes

Beitrag von MSfree » 04.05.2017 12:09:13

niemand hat geschrieben:0 ist das erste Element, 1 also das Zweite und -1 das vor dem Ersten, also das Letzte.
Was allerdings sehr stark von der Programmiersprache abhängt.

Fortran und Pascal fangen bei 1 an zu zählen, C/C++ fängt bei 0 an.
-1 ist im Falle von C/C++ nicht das letzte Element sondern ausschließlich das vor dem ersten.

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Python Listen Indizes

Beitrag von uname » 04.05.2017 12:12:03

Indizes mit 0 zu beginnen statt 1 hat in der Informatik historische Gründe aufgrund des Speicherzugriffs. Klingt blöd, ist aber so
Naja. Wenn man bei 1 anfängt zu zählen kann man das letzte Element nicht mehr adressieren. (8 Bit = 0 .. 255 vs. 1 .. 256)

Ich glaube die 0 wird unterschätzt. Vor allem in der Mathematik der ersten Klasse der Grundschule.

Code: Alles auswählen

0 .. 9
10 .. 19
...
90 .. 99
100 ..
erscheint weit sinnvoller als heute:

Code: Alles auswählen

1 .. 10
11 .. 20
..
91 .. 100
101 ... 
Natürlich ist 0 weiterhin Null also Nichts.

DeletedUserReAsG

Re: Python Listen Indizes

Beitrag von DeletedUserReAsG » 04.05.2017 20:01:37

Was allerdings sehr stark von der Programmiersprache abhängt.
Siehe Threadtitel.

Antworten