Es ist ein Beispiel für die Slice-Notation, und was sie tut, hängt von der Art der Slice-Notation ab population. Wenn populationes sich um eine Liste handelt, wird in dieser Zeile eine flache Kopie der Liste erstellt. Für ein Objekt vom Typ tupleoder a strwird nichts ausgeführt (ohne die Zeile wird dasselbe ausgeführt [:]), und für ein NumPy-Array (z. B.) wird eine neue Ansicht für dieselben Daten erstellt.
Nur für den Fall: Das Slice gibt eine flache Kopie zurück.
André Caron
4
@ilius: Vielleicht l.copy()ist besser lesbar, aber es wird nicht funktionieren.
Sven Marnach
13
list(l)funktioniert immer, ist besser lesbar und garantiert eine Kopie auch mit so etwas wienumpy.array
Rosh Oxymoron
1
@ Eli: Ja, daneben list.clear(). Es wird jedoch einige Zeit dauern, bis dies zu einer signifikanten Reduzierung dieser Art von Fragen zu SO führt. :)
Sven Marnach
1
@ MichaelGraczyk: Ich nehme an, Sie sprechen hier über NumPy-Arrays. Anstatt zu verwenden A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], würde ich es fast immer vorziehen numpy.rollaxis(A, axis, 0)[k]. Im Allgemeinen bin ich selten auf einen Anwendungsfall gestoßen, bei dem Sie slice()Objekte direkt erstellen müssten . Wenn Sie sie trotzdem benötigen, bietet NumPy den s_Helfer als alternative Möglichkeit, sie zu erstellen.
Sven Marnach
27
Es kann auch hilfreich sein zu wissen, dass ein Listen-Slice im Allgemeinen eine Kopie eines Teils der Liste erstellt. ZB population[2:4]wird eine Liste zurückgegeben, die Population [2] und Population [3] enthält (das Schneiden ist ausschließlich rechts). Lassen Sie den linken und rechten Index weg, da population[:]sie standardmäßig 0 bzw. Länge (Grundgesamtheit) sind, und wählen Sie dabei die gesamte Liste aus. Daher ist dies eine gängige Redewendung, um eine Kopie einer Liste zu erstellen.
Nun ... das hängt wirklich vom Kontext ab. Letztendlich übergibt es ein sliceObjekt ( slice(None,None,None)) an eine der folgenden Methoden : __getitem__, __setitem__oder __delitem__. (Wenn das Objekt ein __getslice__hat, wird dieses anstelle von verwendet __getitem__, aber das ist jetzt veraltet und sollte nicht verwendet werden.)
Objekte können mit dem Slice machen, was sie wollen.
Im Zusammenhang mit:
x = obj[:]
Dies wird obj.__getitem__mit dem übergebenen Slice-Objekt aufgerufen . Tatsächlich entspricht dies vollständig:
x = obj[slice(None,None,None)]
(obwohl ersteres wahrscheinlich effizienter ist, weil es den sliceKonstruktor nicht nachschlagen muss - alles erfolgt in Bytecode).
Für die meisten Objekte ist dies eine Möglichkeit, eine flache Kopie eines Teils der Sequenz zu erstellen.
Nächster:
x[:]= obj
Ist eine Möglichkeit, die Elemente (die aufgerufen werden __setitem__) basierend auf festzulegen obj.
und ich denke, Sie können wahrscheinlich erraten, was:
[:]
wird zum Begrenzen oder Schneiden im Array verwendet, Hash
zB:
[1: 5] zum Anzeigen von Werten zwischen 1 einschließlich und 5 exklusiv, dh 1-4
[Start: Ende],
das im Array zum Schneiden im Grunde genommen verwendet wird Wert oder Schlüssel, der angezeigt werden soll, und ":" wird verwendet, um das gesamte Array zu begrenzen oder in Pakete aufzuteilen.
Kein Grund, eine so alte Frage zu beantworten, die bereits 5 ähnliche und sogar eine akzeptierte Antwort hat ... Außerdem werden a[1:5]die Elemente 1-4 und nicht 2-4 zurückgegeben.
Skamah One
@ KamamOne Oh, ich weiß es nicht. Vielleicht nicht in diesem Fall, aber es gibt Zeiten, in denen es von Wert sein kann, tote Fragen zu stellen. Unterschiedliche Einsichten, unterschiedliche Formulierungen usw. In diesem Fall haben Sie die Antwort korrigiert und sie haben hoffentlich auch etwas gelernt.
Antworten:
Es ist ein Beispiel für die Slice-Notation, und was sie tut, hängt von der Art der Slice-Notation ab
population
. Wennpopulation
es sich um eine Liste handelt, wird in dieser Zeile eine flache Kopie der Liste erstellt. Für ein Objekt vom Typtuple
oder astr
wird nichts ausgeführt (ohne die Zeile wird dasselbe ausgeführt[:]
), und für ein NumPy-Array (z. B.) wird eine neue Ansicht für dieselben Daten erstellt.quelle
l.copy()
ist besser lesbar, aber es wird nicht funktionieren.list(l)
funktioniert immer, ist besser lesbar und garantiert eine Kopie auch mit so etwas wienumpy.array
list.clear()
. Es wird jedoch einige Zeit dauern, bis dies zu einer signifikanten Reduzierung dieser Art von Fragen zu SO führt. :)A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)]
, würde ich es fast immer vorziehennumpy.rollaxis(A, axis, 0)[k]
. Im Allgemeinen bin ich selten auf einen Anwendungsfall gestoßen, bei dem Sieslice()
Objekte direkt erstellen müssten . Wenn Sie sie trotzdem benötigen, bietet NumPy dens_
Helfer als alternative Möglichkeit, sie zu erstellen.Es kann auch hilfreich sein zu wissen, dass ein Listen-Slice im Allgemeinen eine Kopie eines Teils der Liste erstellt. ZB
population[2:4]
wird eine Liste zurückgegeben, die Population [2] und Population [3] enthält (das Schneiden ist ausschließlich rechts). Lassen Sie den linken und rechten Index weg, dapopulation[:]
sie standardmäßig 0 bzw. Länge (Grundgesamtheit) sind, und wählen Sie dabei die gesamte Liste aus. Daher ist dies eine gängige Redewendung, um eine Kopie einer Liste zu erstellen.quelle
Nun ... das hängt wirklich vom Kontext ab. Letztendlich übergibt es ein
slice
Objekt (slice(None,None,None)
) an eine der folgenden Methoden :__getitem__
,__setitem__
oder__delitem__
. (Wenn das Objekt ein__getslice__
hat, wird dieses anstelle von verwendet__getitem__
, aber das ist jetzt veraltet und sollte nicht verwendet werden.)Objekte können mit dem Slice machen, was sie wollen.
Im Zusammenhang mit:
Dies wird
obj.__getitem__
mit dem übergebenen Slice-Objekt aufgerufen . Tatsächlich entspricht dies vollständig:(obwohl ersteres wahrscheinlich effizienter ist, weil es den
slice
Konstruktor nicht nachschlagen muss - alles erfolgt in Bytecode).Für die meisten Objekte ist dies eine Möglichkeit, eine flache Kopie eines Teils der Sequenz zu erstellen.
Nächster:
Ist eine Möglichkeit, die Elemente (die aufgerufen werden
__setitem__
) basierend auf festzulegenobj
.und ich denke, Sie können wahrscheinlich erraten, was:
Anrufe ;-).
Sie können auch verschiedene Slices übergeben:
Konstrukte
slice(1,4,None)
Konstrukte
slice(None,None,-1)
und so weiter. Lesen Sie weiter: Erklären Sie Pythons Slice-Notationquelle
Es ist ein Stück vom Anfang der Sequenz bis zum Ende, das normalerweise eine flache Kopie erzeugt.
(Nun, es ist mehr als das , aber du musst dich noch nicht darum kümmern.)
quelle
Es wird eine Kopie der Liste erstellt, anstatt nur einen neuen Namen für die bereits vorhandene Liste zuzuweisen.
quelle
[:]
wird zum Begrenzen oder Schneiden im Array verwendet, Hash
zB:
[1: 5] zum Anzeigen von Werten zwischen 1 einschließlich und 5 exklusiv, dh 1-4
[Start: Ende],
das im Array zum Schneiden im Grunde genommen verwendet wird Wert oder Schlüssel, der angezeigt werden soll, und ":" wird verwendet, um das gesamte Array zu begrenzen oder in Pakete aufzuteilen.
quelle
a[1:5]
die Elemente 1-4 und nicht 2-4 zurückgegeben.