2010-05-03 7 views
6

Die erweiterte Indexierungssyntax wird in Python-Dokument erwähnt.Problem mit Listenschnittsyntax in Python

slice([start], stop[, step]) 

Slice-Objekte werden auch generiert, wenn die erweiterte Indizierungssyntax verwendet wird. Zum Beispiel: a[start:stop:step] oder a[start:stop, i]. Eine alternative Version, die einen Iterator zurückgibt, finden Sie unter itertools.islice().

a[start:stop:step] funktioniert wie beschrieben. Aber was ist mit dem zweiten? Wie wird es benutzt?

+2

Sie sind also zu fragen, was ‚i‘ bedeutet in „a [Start: Stopp, i]“? –

+0

Ja, was ist "i", wenn a eine Sequenz sein soll? – Dingle

+0

'a' ist nicht unbedingt eine Abfolge von einem der Standard-Grundtypen. – Amber

Antwort

10

a[start:stop,i] ruft die Methode a.__getitem__(slice(start,stop,None),i) auf.

Dies löst einen TypeError aus, wenn a eine Liste ist, aber es ist gültig und nützliche Notation, wenn a ein numpy Array ist. Tatsächlich glaube ich, dass die Entwickler von Numpy die Entwickler von Python gebeten haben, die gültige Python-Slicing-Notation genau so zu erweitern, dass die Array-Slicing-Notation einfacher implementiert werden kann.

Zum Beispiel

import numpy as np 
arr=np.arange(12).reshape(4,3) 
print(arr) 
# [[ 0 1 2] 
# [ 3 4 5] 
# [ 6 7 8] 
# [ 9 10 11]] 

1:3 wählt die Zeilen 1 und 2 und die 2 wählt die dritte Spalte:

print(arr[1:3,2]) 
# [5 8] 

PS. Zu Experimentieren mit dem, was in Scheiben schneiden auf __getitem__ geschickt bekommen, können Sie mit diesem Spielzeug Code rumspielen:

class Foo(list): 
    def __getitem__(self,key): 
     return repr(key) 

foo=Foo(range(10)) 
print(foo[1:5,1,2]) 
# (slice(1, 5, None), 1, 2) 
+0

Ich verstehe. Grundsätzlich funktioniert a [start: stop, i] nur mit mehrdimensionalen Arrays, wie sie in numpy implementiert sind. – Dingle

+0

@Dingle: Oder Sie können Ihre eigenen Klassen mit '__getitem__' definieren und Ihre eigene Bedeutung und Verhalten zuweisen! – unutbu

+0

Die Frage ähnelt http://stackoverflow.com/questions/752602/slicing-in-python-expressions-documentation, aber Ihr Beispiel und der Spielzeugcode sind viel einfacher zu folgen. – Dingle

3

Die Notation [:,:] wird verwendet, um multidimensional arrays zu schneiden. Python hat standardmäßig keine mehrdimensionalen Arrays, aber die Syntax unterstützt es und numpy nutzt zum Beispiel diese Syntax.

+2

Und jedes andere benutzerdefinierte Objekt, das potenziell mehrdimensionales Slicing über '__getitem __()' implementiert hat. – Amber