Ich brauche eine gute Erklärung (Referenzen sind ein Plus) für Pythons Slice-Notation.
Für mich muss diese Notation etwas aufgegriffen werden.
Es sieht extrem mächtig aus, aber ich habe es nicht ganz verstanden.
Es ist wirklich ziemlich einfach:
a[start:stop] # items start through stop-1
a[start:] # items start through the rest of the array
a[:stop] # items from the beginning through stop-1
a[:] # a copy of the whole array
Es gibt auch den step
Wert, der mit einem der oben genannten Werte verwendet werden kann:
a[start:stop:step] # start through not past stop, by step
Der wichtigste Punkt, an den Sie sich erinnern sollten, ist, dass der :stop
Wert den ersten Wert darstellt, der sich nicht im ausgewählten Slice befindet. Der Unterschied zwischen stop
und start
ist also die Anzahl der ausgewählten Elemente (wenn step
1 ist, die Standardeinstellung).
Das andere Merkmal ist, dass start
oder stop
kann eine negative Zahl sein, was bedeutet, dass sie vom Ende des Arrays statt vom Anfang zählt. Damit:
a[-1] # last item in the array
a[-2:] # last two items in the array
a[:-2] # everything except the last two items
Ebenso step
kann eine negative Zahl sein:
a[::-1] # all items in the array, reversed
a[1::-1] # the first two items, reversed
a[:-3:-1] # the last two items, reversed
a[-3::-1] # everything except the last two items, reversed
Python ist freundlich zum Programmierer, wenn es weniger Elemente gibt, als Sie verlangen. Wenn Sie beispielsweise nach einem Element fragen a[:-2]
und es a
nur enthalten, erhalten Sie anstelle eines Fehlers eine leere Liste. Manchmal würden Sie den Fehler bevorzugen, daher müssen Sie sich bewusst sein, dass dies passieren kann.
slice()
ObjektDer Slicing-Operator []
wird im obigen Code tatsächlich mit einem slice()
Objekt verwendet, das die :
Notation verwendet (die nur innerhalb gültig ist []
), dh:
a[start:stop:step]
ist äquivalent zu:
a[slice(start, stop, step)]
Slice-Objekte verhalten sich je nach Anzahl der Argumente ebenfalls leicht unterschiedlich, ähnlich wie range()
beide, slice(stop)
und slice(start, stop[, step])
werden unterstützt. Um die Angabe eines bestimmten Arguments zu überspringen, könnte man verwenden None
, so dass zB a[start:]
äquivalent zu a[slice(start, None)]
oder a[::-1]
äquivalent zu ist a[slice(None, None, -1)]
.
Während die :
Notation auf Basis des einfachen Schneidens sehr hilfreich ist, slice()
vereinfacht die explizite Verwendung von Objekten die programmatische Erzeugung des Schneidens.
None
jeden der leeren Räume ersetzen . Zum Beispiel[None:None]
macht eine ganze Kopie. Dies ist nützlich, wenn Sie das Ende des Bereichs mithilfe einer Variablen angeben und das letzte Element einschließen müssen.del
der Schriftart-Notation hinzuzufügen . Insbesonderedel arr[:]
ist nicht sofort offensichtlich ("arr [:] macht eine Kopie, löscht del diese Kopie ???" usw.)Das Python-Tutorial spricht darüber (scrollen Sie ein wenig nach unten, bis Sie zu dem Teil über das Schneiden kommen).
Das ASCII-Grafikdiagramm ist auch hilfreich, um sich daran zu erinnern, wie Slices funktionieren:
quelle
a[-4,-6,-1]
,yP
aber es istty
. Was immer funktioniert, ist, in Zeichen oder Slots zu denken und die Indizierung als halboffenes Intervall zu verwenden - rechts offen, wenn positiver Schritt, links offen, wenn negativer Schritt.x[:0]
dies beim Anfang der Fall ist), sodass Sie kleine Arrays in Sonderfällen erstellen müssen. : /Aufzählung der Möglichkeiten der Grammatik:
Wenn ja
(high-low)%stride != 0
, dann ist der Endpunkt natürlich etwas niedriger alshigh-1
.Wenn
stride
negativ, wird die Reihenfolge etwas geändert, da wir herunterzählen:Erweitertes Slicing (mit Kommas und Ellipsen) wird meist nur von speziellen Datenstrukturen (wie NumPy) verwendet. Die Grundsequenzen unterstützen sie nicht.
quelle
repr
__getitem__
ist; Ihr Beispiel entsprichtapple[slice(4, -4, -1)]
.In den obigen Antworten wird die Slice-Zuweisung nicht erläutert. Um die Slice-Zuweisung zu verstehen, ist es hilfreich, der ASCII-Grafik ein weiteres Konzept hinzuzufügen:
Eine Heuristik ist, für ein Slice von Null bis n zu denken: "Null ist der Anfang, beginnen Sie am Anfang und nehmen Sie n Elemente in eine Liste".
Eine andere Heuristik lautet: "Ersetzen Sie für jedes Slice den Anfang durch Null, wenden Sie die vorherige Heuristik an, um das Ende der Liste zu erhalten, und zählen Sie dann die erste Zahl zurück, um Elemente vom Anfang zu entfernen."
Die erste Regel für die Slice-Zuweisung lautet, dass für die Slice-Zuweisung eine Liste (oder eine andere iterierbare) erforderlich ist, da das Slicing eine Liste zurückgibt :
Die zweite Regel der Slice-Zuweisung, die Sie auch oben sehen können, lautet, dass jeder Teil der Liste, der durch die Slice-Indizierung zurückgegeben wird, derselbe Teil ist, der durch die Slice-Zuweisung geändert wird:
Die dritte Regel für die Slice-Zuweisung lautet, dass die zugewiesene Liste (iterierbar) nicht dieselbe Länge haben muss. Das indizierte Slice wird einfach herausgeschnitten und massenhaft durch das ersetzt, was zugewiesen wird:
Der schwierigste Teil, an den man sich gewöhnen muss, ist die Zuordnung zu leeren Scheiben. Mit Heuristik 1 und 2 können Sie ganz einfach ein leeres Slice indizieren :
Und wenn Sie das gesehen haben, ist auch die Slice-Zuordnung zum leeren Slice sinnvoll:
Da wir die zweite Nummer des Slice (4) nicht ändern, stapeln sich die eingefügten Elemente immer direkt gegen das 'o', selbst wenn wir dem leeren Slice zuweisen. Die Position für die Zuweisung leerer Slices ist also die logische Erweiterung der Positionen für die Zuweisungen nicht leerer Slices.
Was passiert, wenn Sie mit unserer Prozession fortfahren, den Beginn der Scheibe hochzuzählen?
Wenn Sie mit dem Schneiden fertig sind, sind Sie fertig. es beginnt nicht rückwärts zu schneiden. In Python erhalten Sie keine negativen Schritte, es sei denn, Sie fragen explizit nach ihnen, indem Sie eine negative Zahl verwenden.
Die Regel "Sobald Sie fertig sind, sind Sie fertig" hat einige seltsame Konsequenzen:
Tatsächlich ist Python-Slicing im Vergleich zur Indizierung bizarr fehlersicher:
Dies kann manchmal nützlich sein, aber auch zu etwas seltsamem Verhalten führen:
Abhängig von Ihrer Anwendung könnte das ... oder auch nicht ... das sein, was Sie sich dort erhofft haben!
Unten ist der Text meiner ursprünglichen Antwort. Es war für viele Leute nützlich, deshalb wollte ich es nicht löschen.
Dies kann auch den Unterschied zwischen Schneiden und Indizieren verdeutlichen.
quelle
Kurz gesagt, die Doppelpunkte (
:
) in der Index - Notation (subscriptable[subscriptarg]
) make Slice - Notation - , die die optionalen Argumente haben,start
,stop
,step
:Python Slicing ist eine rechnerisch schnelle Methode, um methodisch auf Teile Ihrer Daten zuzugreifen. Meiner Meinung nach ist es ein Aspekt der Sprache, mit dem man vertraut sein muss, um selbst ein fortgeschrittener Python-Programmierer zu sein.
Wichtige Definitionen
Lassen Sie uns zunächst einige Begriffe definieren:
So funktioniert die Indizierung
Sie können jede dieser positiven oder negativen Zahlen eingeben. Die Bedeutung der positiven Zahlen ist unkompliziert, aber für negative Zahlen zählen Sie wie für Indizes in Python vom Ende an für Start und Stopp rückwärts und für den Schritt dekrementieren Sie einfach Ihren Index. Dieses Beispiel stammt aus dem Tutorial der Dokumentation , aber ich habe es leicht geändert, um anzugeben, auf welches Element in einer Sequenz jeder Index verweist:
Wie das Schneiden funktioniert
Um die Slice-Notation mit einer Sequenz zu verwenden, die dies unterstützt, müssen Sie mindestens einen Doppelpunkt in die eckigen Klammern setzen, die der Sequenz folgen (die die Methode der Sequenz gemäß dem Python-Datenmodell tatsächlich implementieren
__getitem__
).Die Slice-Notation funktioniert folgendermaßen:
Und denken Sie daran, dass es Standardeinstellungen für Start , Stopp und Schritt gibt. Um auf die Standardeinstellungen zuzugreifen, lassen Sie das Argument einfach weg.
Die Slice-Notation zum Abrufen der letzten neun Elemente aus einer Liste (oder einer anderen Sequenz, die dies unterstützt, z. B. eine Zeichenfolge) sieht folgendermaßen aus:
Wenn ich das sehe, lese ich den Teil in den Klammern als "9. vom Ende bis zum Ende". (Eigentlich verkürze ich es mental als "-9, on")
Erläuterung:
Die vollständige Notation ist
und um die Standardeinstellungen zu ersetzen (tatsächlich, wenn sie
step
negativ sind, iststop
die Standardeinstellung-len(my_list) - 1
, alsoNone
bedeutet Stop wirklich nur, dass es zu dem Endschritt geht, zu dem es führt):Der Doppelpunkt ,
:
ist, was Python sagt Sie , ihm ein Stück und nicht einen regulären Index sind zu geben. Aus diesem Grund ist die idiomatische Art, eine flache Kopie von Listen in Python 2 zu erstellen, die folgendeUnd sie zu löschen ist mit:
(Python 3 erhält eine
list.copy
undlist.clear
Methode.)Wenn
step
negativ ist, ändern sich die Standardeinstellungenstart
undstop
ändern sichWenn das
step
Argument leer (oderNone
) ist, wird es standardmäßig zugewiesen+1
.Sie können jedoch eine negative Ganzzahl übergeben, und die Liste (oder die meisten anderen Standard-Slicables) wird vom Ende bis zum Anfang aufgeteilt.
Somit ändert ein negativer Slice die Standardeinstellungen für
start
undstop
!Bestätigen Sie dies in der Quelle
Ich möchte Benutzer dazu ermutigen, sowohl die Quelle als auch die Dokumentation zu lesen. Den Quellcode für Slice-Objekte und diese Logik finden Sie hier . Zuerst bestimmen wir, ob
step
negativ ist:Wenn ja, bedeutet die Untergrenze,
-1
dass wir bis zum Anfang schneiden, und die Obergrenze ist die Länge minus 1, was bedeutet, dass wir am Ende beginnen. (Beachten Sie, dass die Semantik dies-1
ist unterschiedlich von einem ,-1
dass die Benutzer - Indizes in Python passieren kann das letzte Element angezeigt wird .)Andernfalls
step
ist es positiv, und die Untergrenze ist Null und die Obergrenze (bis zu der wir gehen, aber nicht einschließen) die Länge der geschnittenen Liste.Dann müssen wir möglicherweise die Standardeinstellungen für
start
und anwendenstop
- der Standardwert fürstart
wird dann als Obergrenze berechnet, wenn erstep
negativ ist:und
stop
die Untergrenze:Geben Sie Ihren Scheiben einen beschreibenden Namen!
Es kann nützlich sein, das Slice von der Übergabe an die
list.__getitem__
Methode zu trennen ( genau das tun die eckigen Klammern ). Selbst wenn Sie nicht neu darin sind, bleibt Ihr Code besser lesbar, sodass andere, die Ihren Code möglicherweise lesen müssen, besser verstehen können, was Sie tun.Sie können einer Variablen jedoch nicht einfach einige durch Doppelpunkte getrennte Ganzzahlen zuweisen. Sie müssen das Slice-Objekt verwenden:
Das zweite Argument
None
ist erforderlich, damit das erste Argument alsstart
Argument interpretiert wird, andernfalls wäre es dasstop
Argument .Sie können das Slice-Objekt dann an Ihre Sequenz übergeben:
Es ist interessant, dass Bereiche auch Scheiben nehmen:
Überlegungen zum Speicher:
Da Scheiben Python - Listen neue Objekte im Speicher zu erstellen, in einer anderen wichtige Funktion bewusst ist , zu sein
itertools.islice
. Normalerweise möchten Sie über ein Slice iterieren und es nicht nur statisch im Speicher erstellen lassen.islice
ist perfekt dafür. Ein Vorbehalt, es unterstützt nicht die negativen Argumentestart
,stop
oderstep
, also , wenn das ein Problem ist Sie benötigen Indizes berechnen oder den iterable im Voraus zu umkehren.und nun:
Die Tatsache, dass Listen-Slices eine Kopie erstellen, ist ein Merkmal der Listen selbst. Wenn Sie erweiterte Objekte wie einen Pandas DataFrame in Scheiben schneiden, wird möglicherweise eine Ansicht des Originals und keine Kopie zurückgegeben.
quelle
Und ein paar Dinge, die mir nicht sofort klar waren, als ich die Slicing-Syntax zum ersten Mal sah:
Einfache Möglichkeit, Sequenzen umzukehren!
Und wenn Sie aus irgendeinem Grund jeden zweiten Punkt in umgekehrter Reihenfolge wollten:
quelle
In Python 2.7
In Python schneiden
Das Verständnis der Indexzuweisung ist sehr wichtig.
Wenn Sie [a: b: c] sagen, sagen Sie abhängig vom Vorzeichen von c (vorwärts oder rückwärts), beginnen Sie bei a und enden Sie bei b (ohne Element am b-ten Index). Verwenden Sie die obige Indizierungsregel und denken Sie daran, dass Sie nur Elemente in diesem Bereich finden:
Dieser Bereich setzt sich jedoch unendlich in beide Richtungen fort:
Zum Beispiel:
Wenn Ihre Auswahl von a, b und c eine Überlappung mit dem obigen Bereich beim Durchlaufen unter Verwendung der Regeln für a, b, c oben zulässt, erhalten Sie entweder eine Liste mit Elementen (die während des Durchlaufs berührt werden) oder eine leere Liste.
Eine letzte Sache: Wenn a und b gleich sind, erhalten Sie auch eine leere Liste:
quelle
a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; a[:-2:-2]
was zu[9]
Ich habe diese großartige Tabelle unter http://wiki.python.org/moin/MovingToPythonFromOtherLanguages gefunden
quelle
Nachdem ich es ein wenig benutzt habe, stelle ich fest, dass die einfachste Beschreibung ist, dass es genau das gleiche ist wie die Argumente in einer
for
Schleife ...Alle sind optional:
Für die negative Indizierung müssen Sie nur die Länge der Zeichenfolge zu den negativen Indizes hinzufügen, um sie zu verstehen.
Das funktioniert sowieso bei mir ...
quelle
Es fällt mir leichter, mich daran zu erinnern, wie es funktioniert, und dann kann ich eine bestimmte Kombination aus Start, Stopp und Schritt herausfinden.
Es ist lehrreich,
range()
zuerst zu verstehen :Beginnen Sie mit
start
, erhöhen Sie umstep
, erreichen Sie nichtstop
. Sehr einfach.Die Sache, an die man sich beim negativen Schritt erinnern sollte, ist, dass
stop
immer das ausgeschlossene Ende ist, egal ob es höher oder niedriger ist. Wenn Sie dasselbe Slice in umgekehrter Reihenfolge möchten, ist es viel sauberer, die Umkehrung separat durchzuführen: z. B.'abcde'[1:-2][::-1]
schneidet ein Zeichen von links, zwei von rechts ab und kehrt dann um. (Siehe auchreversed()
.)Das Sequenz-Slicing ist dasselbe, außer dass es zuerst negative Indizes normalisiert und niemals außerhalb der Sequenz liegen kann:
TODO : Der folgende Code hatte einen Fehler mit "nie außerhalb der Sequenz gehen", wenn abs (Schritt)> 1; Ich glaube, ich habe es gepatcht, um es richtig zu machen, aber es ist schwer zu verstehen.
Machen Sie sich keine Sorgen um die
is None
Details - denken Sie daran, dass das Weglassenstart
und / oderstop
immer das Richtige tut, um Ihnen die gesamte Sequenz zu geben.Wenn Sie zuerst die negativen Indizes normalisieren, können Start und / oder Stopp unabhängig vom Ende gezählt werden:
'abcde'[1:-2] == 'abcde'[1:3] == 'bc'
trotzrange(1,-2) == []
. Die Normalisierung wird manchmal als "Modulo der Länge" angesehen, aber beachten Sie, dass die Länge nur einmal hinzugefügt'abcde'[-53:42]
wird : zB ist nur die gesamte Zeichenfolge.quelle
this_is_how_slicing_works
ist nicht dasselbe wie Python Slice. EG[0, 1, 2][-5:3:3]
wird [0] in Python erhalten, aberlist(this_is_how_slicing_works([0, 1, 2], -5, 3, 3))
[1].range(4)[-200:200:3] == [0, 3]
aberlist(this_is_how_slicing_works([0, 1, 2, 3], -200, 200, 3)) == [2]
. Meinif 0 <= i < len(seq):
Versuch war, "nie außerhalb der Sequenz gehen" einfach zu implementieren, ist aber für Schritt> 1 falsch. Ich werde es später heute umschreiben (mit Tests).Ich benutze die Methode "Ein Index zeigt zwischen Elementen", um selbst darüber nachzudenken, aber eine Art, es zu beschreiben, die manchmal anderen hilft, es zu bekommen, ist folgende:
X ist der Index des ersten gewünschten Elements.
Y ist der Index des ersten Elements, das Sie nicht möchten.
quelle
Ich hoffe, dies wird Ihnen helfen, die Liste in Python zu modellieren.
Referenz: http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
quelle
Python-Slicing-Notation:
start
undend
werden negative Werte als relativ zum Ende der Sequenz interpretiert.end
geben die Position danach an dem letzten Element an, das aufgenommen werden soll.[+0:-0:1]
.start
und umend
Die Notation erstreckt sich auf (numpy) Matrizen und mehrdimensionale Arrays. Zum Schneiden ganzer Spalten können Sie beispielsweise Folgendes verwenden:
Slices enthalten Verweise und keine Kopien der Array-Elemente. Wenn Sie eine separate Kopie eines Arrays erstellen möchten, können Sie diese verwenden
deepcopy()
.quelle
Sie können auch die Slice-Zuweisung verwenden, um ein oder mehrere Elemente aus einer Liste zu entfernen:
quelle
Dies ist nur für einige zusätzliche Informationen ... Betrachten Sie die Liste unten
Einige andere Tricks zum Umkehren der Liste:
quelle
So bringe ich Neulingen Scheiben bei:
Den Unterschied zwischen Indizieren und Schneiden verstehen:
Wiki Python hat dieses erstaunliche Bild, das Indizierung und Slicing klar unterscheidet.
Es ist eine Liste mit sechs Elementen. Um das Schneiden besser zu verstehen, betrachten Sie diese Liste als einen Satz von sechs Feldern, die zusammen angeordnet sind. Jede Box enthält ein Alphabet.
Die Indizierung ist wie der Umgang mit dem Inhalt der Box. Sie können den Inhalt eines beliebigen Kästchens überprüfen. Sie können jedoch nicht den Inhalt mehrerer Kästchen gleichzeitig überprüfen. Sie können sogar den Inhalt der Box ersetzen. Sie können jedoch nicht zwei Bälle in eine Schachtel legen oder zwei Bälle gleichzeitig ersetzen.
Das Schneiden ist wie der Umgang mit Kisten selbst. Sie können die erste Schachtel aufheben und auf einen anderen Tisch stellen. Um die Box aufzunehmen, müssen Sie lediglich die Position von Anfang und Ende der Box kennen.
Sie können sogar die ersten drei Felder oder die letzten beiden Felder oder alle Felder zwischen 1 und 4 auswählen. Sie können also einen beliebigen Satz von Feldern auswählen, wenn Sie den Anfang und das Ende kennen. Diese Positionen werden als Start- und Stopppositionen bezeichnet.
Das Interessante ist, dass Sie mehrere Boxen gleichzeitig ersetzen können. Sie können auch mehrere Felder platzieren, wo immer Sie möchten.
Schneiden mit Schritt:
Bis jetzt haben Sie fortlaufend Kisten gepflückt. Aber manchmal müssen Sie diskret abholen. Zum Beispiel können Sie jede zweite Box abholen. Sie können sogar jede dritte Kiste am Ende abholen. Dieser Wert wird als Schrittgröße bezeichnet. Dies stellt die Lücke zwischen Ihren aufeinanderfolgenden Tonabnehmern dar. Die Schrittgröße sollte positiv sein, wenn Sie Kästchen von Anfang bis Ende auswählen und umgekehrt.
Wie Python fehlende Parameter herausfindet:
Wenn Sie beim Schneiden einen Parameter weglassen, versucht Python, ihn automatisch herauszufinden.
Wenn Sie den Quellcode von CPython überprüfen , finden Sie eine Funktion namens PySlice_GetIndicesEx (), die Indizes für ein Slice für bestimmte Parameter ermittelt. Hier ist der logisch äquivalente Code in Python.
Diese Funktion verwendet ein Python-Objekt und optionale Parameter für das Slicing und gibt die Start-, Stopp-, Schritt- und Slice-Länge für das angeforderte Slice zurück.
Dies ist die Intelligenz, die hinter Scheiben vorhanden ist. Da Python über eine integrierte Funktion namens Slice verfügt, können Sie einige Parameter übergeben und überprüfen, wie intelligent fehlende Parameter berechnet werden.
Hinweis: Dieser Beitrag wurde ursprünglich in meinem Blog The Intelligence Behind Python Slices geschrieben .
quelle
In der Regel führt das Schreiben von Code mit vielen fest codierten Indexwerten zu Lesbarkeits- und Wartungsproblemen. Wenn Sie beispielsweise ein Jahr später auf den Code zurückkommen, werden Sie ihn sich ansehen und sich fragen, was Sie gedacht haben, als Sie ihn geschrieben haben. Die gezeigte Lösung ist lediglich eine Möglichkeit, klarer anzugeben, was Ihr Code tatsächlich tut. Im Allgemeinen erstellt das integrierte Slice () ein Slice-Objekt, das überall dort verwendet werden kann, wo ein Slice zulässig ist. Zum Beispiel:
Wenn Sie eine Slice-Instanz haben, können Sie weitere Informationen dazu erhalten, indem Sie sich die Attribute s.start, s.stop und s.step ansehen. Zum Beispiel:
quelle
1. Slice-Notation
Denken Sie zur Vereinfachung daran, dass Slice nur eine Form hat:
und so funktioniert es:
s
: ein Objekt, das in Scheiben geschnitten werden kannstart
: Erster Index zum Starten der Iterationend
: letzter Index, HINWEIS: Derend
Index wird nicht in das resultierende Slice aufgenommenstep
: wähle jedesstep
Indexelement ausEine weitere Import Sache: alle
start
,end
,step
kann verzichtet werden! Und wenn sie nicht angegeben werden, wird ihr Standardwert verwendet werden:0
,len(s)
,1
entsprechend.Mögliche Variationen sind also:
HINWEIS: Wenn
start >= end
(nur wennstep>0
), gibt Python ein leeres Slice zurück[]
.2. Fallstricke
Im obigen Teil werden die Hauptfunktionen für die Funktionsweise von Slice erläutert, die in den meisten Fällen funktionieren. Es kann jedoch Fallstricke geben, auf die Sie achten sollten, und dieser Teil erklärt sie.
Negative Indizes
Das allererste, was Python-Lernende verwirrt, ist, dass ein Index negativ sein kann! Keine Panik: Ein negativer Index bedeutet, rückwärts zu zählen.
Zum Beispiel:
Negativer Schritt
Die Dinge verwirrender zu machen ist, dass
step
das auch negativ sein kann!Ein negativer Schritt bedeutet, dass das Array rückwärts iteriert wird: vom Ende bis zum Start, wobei der Endindex enthalten ist und der Startindex vom Ergebnis ausgeschlossen ist.
HINWEIS : wenn der Schritt negativ ist , ist der Standardwert für
start
istlen(s)
(währendend
nicht gleich ist0
, weils[::-1]
enthälts[0]
). Zum Beispiel:Fehler außerhalb des Bereichs?
Seien Sie überrascht: Slice löst keinen IndexError aus, wenn der Index außerhalb des Bereichs liegt!
Wenn der Index außerhalb des Bereichs liegt, versucht Python nach besten Kräften, den Index auf
0
oderlen(s)
entsprechend der Situation festzulegen. Zum Beispiel:3. Beispiele
Lassen Sie uns diese Antwort mit Beispielen beenden und alles erklären, was wir besprochen haben:
quelle
In den vorherigen Antworten wird nicht auf mehrdimensionales Array-Slicing eingegangen, das mit dem berühmten NumPy- Paket möglich ist:
Das Schneiden kann auch auf mehrdimensionale Arrays angewendet werden.
Das "
:2
" vor dem Komma wirkt auf die erste Dimension und das "0:3:2
" nach dem Komma auf die zweite Dimension.quelle
list
sondern nur aufarray
in NumpySie können dieses Skript ausführen und damit experimentieren. Nachfolgend finden Sie einige Beispiele, die ich aus dem Skript erhalten habe.
Beachten Sie bei Verwendung eines negativen Schritts, dass die Antwort um 1 nach rechts verschoben ist.
quelle
Mein Gehirn scheint glücklich zu sein, zu akzeptieren, dass es
lst[start:end]
denstart
-ten Gegenstand enthält . Ich könnte sogar sagen, dass es eine "natürliche Annahme" ist.Aber gelegentlich schleicht sich ein Zweifel ein und mein Gehirn bittet um Bestätigung, dass es nicht das
end
-te Element enthält.In diesen Momenten verlasse ich mich auf diesen einfachen Satz:
Diese hübsche Eigenschaft sagt mir, dass
lst[start:end]
sie dasend
-te Element nicht enthält , weil es in istlst[end:]
.Beachten Sie, dass dieser Satz für
n
alle gilt. Sie können dies beispielsweise überprüfenkehrt zurück
True
.quelle
Meiner Meinung nach werden Sie die Python-String-Slicing-Notation besser verstehen und auswendig lernen, wenn Sie sie folgendermaßen betrachten (lesen Sie weiter).
Lassen Sie uns mit der folgenden Zeichenfolge arbeiten ...
Für diejenigen, die es nicht wissen, können Sie
azString
mithilfe der Notation einen beliebigen Teilstring erstellenazString[x:y]
Aus anderen Programmiersprachen kommend, wird der gesunde Menschenverstand beeinträchtigt. Was sind x und y?
Ich musste mich hinsetzen und verschiedene Szenarien ausführen, um eine Memorisierungstechnik zu finden, die mir hilft, mich an x und y zu erinnern und beim ersten Versuch, Strings richtig zu schneiden.
Meine Schlussfolgerung ist, dass x und y als die Grenzindizes angesehen werden sollten, die die Zeichenfolgen umgeben, die wir hinzufügen möchten. Wir sollten den Ausdruck also als
azString[index1, index2]
oder noch deutlicher als sehenazString[index_of_first_character, index_after_the_last_character]
.Hier ist ein Beispiel für eine Visualisierung davon ...
Sie müssen also nur index1 und index2 auf die Werte setzen, die den gewünschten Teilstring umgeben. Um beispielsweise den Teilstring "cdefgh" abzurufen, können Sie ihn verwenden
azString[2:8]
, da der Index auf der linken Seite von "c" 2 und der auf der rechten Seite von "h" 8 ist.Denken Sie daran, dass wir die Grenzen setzen. Und diese Grenzen sind die Positionen, an denen Sie einige Klammern platzieren können, die wie folgt um den Teilstring gewickelt werden ...
ab [ cdefgh ] ij
Dieser Trick funktioniert die ganze Zeit und ist leicht zu merken.
quelle
Die meisten der vorherigen Antworten klären Fragen zur Slice-Notation.
Die erweiterte Indizierungssyntax für das Slicing lautet
aList[start:stop:step]
: Grundlegende Beispiele sind:::
Weitere Schnittbeispiele: 15 Extended Slices
quelle
In Python ist die grundlegendste Form zum Schneiden die folgende:
Wo
l
ist eine Sammlung,start
ist ein inklusiver Index undend
ist ein exklusiver Index.Wenn Sie von Anfang an schneiden, können Sie den Nullindex weglassen, und wenn Sie bis zum Ende schneiden, können Sie den endgültigen Index weglassen, da er redundant ist. Seien Sie also nicht wortreich:
Negative Ganzzahlen sind nützlich, wenn Offsets relativ zum Ende einer Sammlung ausgeführt werden:
Es ist möglich, Indizes bereitzustellen, die beim Schneiden außerhalb der Grenzen liegen, wie z.
Denken Sie daran, dass das Ergebnis des Schneidens einer Sammlung eine völlig neue Sammlung ist. Wenn Sie die Slice-Notation in Zuweisungen verwenden, muss die Länge der Slice-Zuweisungen nicht gleich sein. Die Werte vor und nach dem zugewiesenen Slice werden beibehalten, und die Sammlung wird verkleinert oder vergrößert, um die neuen Werte zu enthalten:
Wenn Sie den Start- und Endindex weglassen, erstellen Sie eine Kopie der Sammlung:
Wenn die Start- und Endindizes beim Ausführen einer Zuweisungsoperation weggelassen werden, wird der gesamte Inhalt der Sammlung durch eine Kopie dessen ersetzt, worauf verwiesen wird:
Neben dem einfachen Schneiden ist es auch möglich, die folgende Notation anzuwenden:
Wo
l
ist eine Sammlung,start
ist ein inklusiver Index,end
ist ein exklusiver Index undstep
ist ein Schritt, der verwendet werden kann, um jedes n-te Element aufzunehmenl
.Die Verwendung
step
bietet einen nützlichen Trick, um eine Sammlung in Python umzukehren:Es ist auch möglich, negative Ganzzahlen für
step
das folgende Beispiel zu verwenden:Die Verwendung eines negativen Werts für kann
step
jedoch sehr verwirrend werden. Um darüber hinaus zu sein Pythonic , sollten Sie vermeiden , mitstart
,end
undstep
in einer einzigen Scheibe. Wenn dies erforderlich ist, sollten Sie dies in zwei Aufgaben tun (eine zum Schneiden und die andere zum Schritt).quelle
Ich möchte eine hinzufügen Hallo, Welt! Beispiel, das die Grundlagen von Slices für Anfänger erklärt. Es hat mir sehr geholfen.
Lassen Sie uns eine Liste mit sechs Werten haben
['P', 'Y', 'T', 'H', 'O', 'N']
:Die einfachsten Abschnitte dieser Liste sind die Unterlisten. Die Notation ist
[<index>:<index>]
und der Schlüssel ist, es so zu lesen:Wenn Sie nun einen Ausschnitt
[2:5]
aus der obigen Liste erstellen, geschieht Folgendes:Sie haben einen Schnitt vor dem Element mit dem Index
2
und einem anderen Schnitt vor dem Element mit dem Index5
. Das Ergebnis ist also ein Schnitt zwischen diesen beiden Schnitten, eine Liste['T', 'H', 'O']
.quelle
Ich persönlich denke darüber nach wie eine
for
Schleife:Beachten Sie außerdem, dass negative Werte für
start
undend
relativ zum Ende der Liste sind und im obigen Beispiel von berechnet wurdengiven_index + a.shape[0]
.quelle
Das Folgende ist das Beispiel eines Index einer Zeichenfolge:
Schnittbeispiel: [Start: Ende: Schritt]
Unten ist die Beispielverwendung:
quelle
Wenn Sie der Meinung sind, dass negative Indizes beim Schneiden verwirrend sind, können Sie dies ganz einfach in Betracht ziehen: Ersetzen Sie einfach den negativen Index durch
len - index
. Ersetzen Sie beispielsweise -3 durchlen(list) - 3
.Der beste Weg, um zu veranschaulichen, was das Schneiden intern tut, besteht darin, es nur in Code zu zeigen, der diese Operation implementiert:
quelle
Die grundlegende Schneidetechnik besteht darin, den Startpunkt, den Haltepunkt und die Schrittgröße zu definieren - auch als Schritt bezeichnet.
Zuerst erstellen wir eine Liste von Werten, die in unserem Slicing verwendet werden sollen.
Erstellen Sie zwei Listen zum Schneiden. Die erste ist eine numerische Liste von 1 bis 9 (Liste A). Die zweite ist ebenfalls eine numerische Liste von 0 bis 9 (Liste B):
Indexieren Sie die Nummer 3 von A und die Nummer 6 von B.
Grundlegendes Schneiden
Die erweiterte Indexierungssyntax für das Slicing lautet aList [start: stop: step]. Das Startargument und das Schrittargument sind standardmäßig keine - das einzige erforderliche Argument ist stop. Haben Sie bemerkt, dass dies ähnlich ist, wie der Bereich zum Definieren der Listen A und B verwendet wurde? Dies liegt daran, dass das Slice-Objekt den Satzbereich darstellt, der durch den Bereich (Start, Stopp, Schritt) angegeben wird. Python 3.4-Dokumentation.
Wie Sie sehen können, gibt das Definieren nur von stop ein Element zurück. Da der Start standardmäßig "none" ist, wird nur ein Element abgerufen.
Es ist wichtig zu beachten, dass das erste Element der Index 0 ist, nicht Index 1 ist. Aus diesem Grund verwenden wir für diese Übung zwei Listen. Die Elemente von Liste A werden gemäß der Ordnungsposition nummeriert (das erste Element ist 1, das zweite Element ist 2 usw.), während die Elemente von Liste B die Zahlen sind, die verwendet werden würden, um sie zu indizieren ([0] für das erste Element 0, usw.).
Mit der erweiterten Indizierungssyntax rufen wir einen Wertebereich ab. Beispielsweise werden alle Werte mit einem Doppelpunkt abgerufen.
Um eine Teilmenge von Elementen abzurufen, müssen die Start- und Stopppositionen definiert werden.
Rufen Sie unter Berücksichtigung des Musters aList [start: stop] die ersten beiden Elemente aus Liste A ab.
quelle
Ich denke nicht, dass das Python-Tutorial- Diagramm (in verschiedenen anderen Antworten zitiert) gut ist, da dieser Vorschlag für positive Schritte funktioniert, aber nicht für negative Schritte.
Dies ist das Diagramm:
Aus dem Diagramm erwarte ich
a[-4,-6,-1]
,yP
aber es istty
.Was immer funktioniert, ist, in Zeichen oder Slots zu denken und die Indizierung als halboffenes Intervall zu verwenden - rechts offen, wenn positiver Schritt, links offen, wenn negativer Schritt.
Auf diese Weise kann ich mir
a[-4:-6:-1]
wiea(-6,-4]
in der Intervallterminologie vorstellen.quelle