Seite 1 von 1

Listen Indizierung á la "[-1:]" - was ist Python's

Verfasst: Montag 19. Januar 2009, 22:39
von fredistdurstig
Hallo,
Habe mal ne Anfängerfrage: mir wird irgendwie nicht klar, wie Python bei der Anzeige einer bestimmten Range aus Elementen einer gegebenen Liste vorgeht.

Ein kleines Beispiel:

Code: Alles auswählen

v=(9,10,11)
print(v[:-1])
(9,10)
Für mich als Newbie wäre als Ausgabe eher (9,11) logisch gewesen - ich würde (offensichtlich fälschlicherweise) annehmen, dass python eine Range vom 0. Element (9) bis zum letzten bzw. -1. Element (11) bildet.

Mir geht es nicht so sehr um dieses Beispiel, sondern ich würde gerne allgemein wissen: Wie ist die richtige Denkweise, um das System der Indizierung zu verstehen? Gibts vielleicht irgendwo ne Grafik, die das anschaulich macht?
Großen Dank schonmal!

Verfasst: Montag 19. Januar 2009, 22:45
von C4S3
Python gibt in dem Fall von Element 1 bis -1 (also - 1 von hinten, exklusive) aus.
Demnach ergibt (9,10) durchaus Sinn.

Verfasst: Montag 19. Januar 2009, 23:14
von Leonidas
C4S3 hat geschrieben:Python gibt in dem Fall von Element 1 bis -1 (also - 1 von hinten, exklusive) aus.
Eher Element 0 bis Element -1.

Verfasst: Montag 19. Januar 2009, 23:29
von madfrog
Mit einer Grafik kann ich nicht aufwarten. Aber folgende Regel habe ich bisher festgestellt (ich bin auch noch ein Beginner ... :( ):

Bei Range-Angaben wie range(1, 5) gilt: links ist inklusive, rechts ist exklusive. D.h. diese Range geht von inklusive 1 bis inklusive 4 (= exklusive 5).
Also range(1, 5) = [1, 2, 3, 4]

Von links fängt Python bei 0 an zu zählen. D.h. das erste Element in einer Liste oder Tupel ist Element 0. Von Rechts kann man runterzählen indem man das Element -1 als letztes Element anspricht.

Fehlt der linke Index wie in (:5) so wird implizit von Anfang der Struktur gegangen. Also ist (:5) = (0:5).
Fehlt der rechte Index wie in (5: ) so wird bis zum Ende der Struktur gegangen. Also (5: ) = (5:-0). -0 existiert aber nicht, sondern soll hier nur andeuten, daß wir über die Länge der Struktur einen Schritt hinausgehen um der Regel, daß das rechte Element exklusiv ist, gerecht zu werden.

In der folgenden Grafik sind die Indexe von Links den Indexen von Rechts gegenübergestellt:

Code: Alles auswählen

Index des Elements von links:    0   1  2  3  4  5  6  7  8   9  10  
Liste =                        [ 1,  2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
Index des Elements von rechts: -11 -10 -9 -8 -7 -6 -5 -4 -3  -2  -1
So bedeutet v[:-1]: beginne am Anfang des Tupels und gehe bis zum Ende, exklusive des Elements -1 (das letzte Element im Tupel). Und genau das hast du ja erhalten.

Ich hoffe das hilft... :wink:

Verfasst: Montag 19. Januar 2009, 23:29
von fredistdurstig
Danke, genau sone "Lehrer"-artige Antwort habe ich gebraucht!

Dieses Forum ist der Hammer, selten so schnell (gute) Antworten bekommen.

Verfasst: Montag 19. Januar 2009, 23:33
von Leonidas
Einmal gehst du vom vorletzten Element bis zum Ende und einmal versuchst du vom vorletzten Element zum ersten Element zu gehen mit Schritten von 1 (Wenn man den Schritt nicht explizit angibt ist er 1). Geht natürlich so nicht, denn man kann auch mit beliebig vielen Schritten nach vorne nicht wieder an den Anfang kommen.

Edit: Jetzt hast du deinen Post editiert und meine Antwort macht keinen Sinn mehr. Naja.

Verfasst: Montag 19. Januar 2009, 23:35
von madfrog
Es gilt der linke Index muß stets größer sein, als der Rechte. Sonst erhälts du eine leere Liste.

Dabei ist nicht der Zahlenwert per se gemeint, sondern der Index der durch den Zahlenwert angesprochen wird. So ist, z.b. mit x = [1, 2, 3, 4, 5, 6,7, 8, 9, 10], x[3:-5] gültig, da der durch 3 addressierte Index kleiner ist als der durch -5 addressierte Index.

Verfasst: Montag 19. Januar 2009, 23:35
von str1442
-2 sliced von dem -2ten Element (also dem vorletztem) bis zum Ende. -2:0 Würde vom Vorletzem Element bis zum 0ten slicen. Das funktioniert natürlich nicht, da so ein Slice in keiner Liste existieren kann. (so im 1 < 0 Stil)

Verfasst: Montag 19. Januar 2009, 23:39
von cofi
Wuhu! 3 Posts ergeben wg einem Edit keinen Sinn mehr :twisted: Und ich war grad dabei den 4. zu schreiben ... :lol:
@fred Böse, Böse! :twisted:

Verfasst: Montag 19. Januar 2009, 23:48
von fredistdurstig
:roll:
Sorry, ich wusste nicht dass die Aktivitaet hier zu dieser Uhrzeit noch so hoch ist.
In meinen sonstigen Foren (Java, Flex) muss ich auf die Antworten teilweise Stunden bis Tage warten (okay, die Fragen sind dann auch um einiges komplexer).

Habs jetzt jedenfalls gecheckt mit der Adressierung, danke an die Hilfsbereiten!

Verfasst: Montag 19. Januar 2009, 23:50
von fredistdurstig
Wen es interessiert hier mein Posting das ich "versehentlich" :wink: ersetzt habe
Sorry, ich weiss ich stell mich wohl etwas doof an. Das Prinzip ist mir irgendwie noch nicht ganz klar. Gibts da nicht irgendne Analogie um das zu verstehen?

Also im Beispiel geht [:-1] vom Start los und sammelt nach rechts alles ein, was bis ausschliesslich des letzten Elements kommt?

Noch ein kleines Beispiel, was ich nicht verstehe wäre:

Code: Alles auswählen

>>> print(v[-2:])
[65, 91]
>>> print(v[-2:0])
[]
Wo liegt der Unterschied?