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

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
fredistdurstig
User
Beiträge: 13
Registriert: Sonntag 18. Januar 2009, 20:08

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!
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Python gibt in dem Fall von Element 1 bis -1 (also - 1 von hinten, exklusive) aus.
Demnach ergibt (9,10) durchaus Sinn.
Gruß!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
madfrog
User
Beiträge: 19
Registriert: Montag 19. Januar 2009, 01:56

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:
Zuletzt geändert von madfrog am Montag 19. Januar 2009, 23:31, insgesamt 2-mal geändert.
fredistdurstig
User
Beiträge: 13
Registriert: Sonntag 18. Januar 2009, 20:08

Danke, genau sone "Lehrer"-artige Antwort habe ich gebraucht!

Dieses Forum ist der Hammer, selten so schnell (gute) Antworten bekommen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
madfrog
User
Beiträge: 19
Registriert: Montag 19. Januar 2009, 01:56

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.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

-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)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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:
fredistdurstig
User
Beiträge: 13
Registriert: Sonntag 18. Januar 2009, 20:08

: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!
fredistdurstig
User
Beiträge: 13
Registriert: Sonntag 18. Januar 2009, 20:08

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?
Antworten