2009-04-15 13 views
13

No entiendo la siguiente parte de la documentación de Python:"rebanar" en la documentación de Python Expresiones

http://docs.python.org/reference/expressions.html#slicings

Es esto en referencia a la lista de rebanar (x=[1,2,3,4]; x[0:2]) ..? las partes sobre todo en referencia a la elipsis ..

slice_item  ::= expression | proper_slice | ellipsis 

La conversión de un elemento de división que es una expresión que es la expresión. La conversión de un elemento de sector de puntos suspensivos es el objeto Ellipsis incorporado.

Respuesta

13

Definición de clase de prueba simple que sólo imprime lo que se está pasando:

>>> class TestGetitem(object): 
... def __getitem__(self, item): 
...  print type(item), item 
... 
>>> t = TestGetitem() 

ejemplo Expresión:

>>> t[1] 
<type 'int'> 1 
>>> t[3-2] 
<type 'int'> 1 
>>> t['test'] 
<type 'str'> test 
>>> t[t] 
<class '__main__.TestGetitem'> <__main__.TestGetitem object at 0xb7e9bc4c> 

rebanada ejemplo:

>>> t[1:2] 
<type 'slice'> slice(1, 2, None) 
>>> t[1:'this':t] 
<type 'slice'> slice(1, 'this', <__main__.TestGetitem object at 0xb7e9bc4c>) 

Elipsis ejemplo:

>>> t[...] 
<type 'ellipsis'> Ellipsis 

tupla con puntos suspensivos y la rebanada:

>>> t[...,1:] 
<type 'tuple'> (Ellipsis, slice(1, None, None)) 
7

Lo que sucede es esto. Ver http://docs.python.org/reference/datamodel.html#types y http://docs.python.org/library/functions.html#slice

objetos de división se utilizan para representar rodajas cuando se extiende sintaxis rebanada es utilizado. Este es un corte usando dos puntos , o múltiples segmentos o elipses separados por comas, por ejemplo, a [i: j: paso], a [i: j, k: l], o a [..., i: j]. También se crean mediante la función slice() incorporada .

Atributos especiales de solo lectura: inicio es el límite inferior; stop es el límite superior de ; el paso es el valor del paso; cada uno es Ninguno si se omite. Estos atributos pueden tener cualquier tipo.

x=[1,2,3,4] 
x[0:2] 

El "0: 2" se transforma en un objeto Slice con arranque de 0, parada de 2 y una etapa de Ninguno.

Este objeto Slice se proporciona al x 's __getitem__ método de clases que usted defina.

>>> class MyClass(object): 
    def __getitem__(self, key): 
     print type(key), key 


>>> x=MyClass() 
>>> x[0:2] 
<type 'slice'> slice(0, 2, None) 

Para la clase lista de construir-en, sin embargo, un método especial __getslice__ deben ser anulados.

class MyList(list): 
    def __getslice__(self, i, j=None, k=None): 
     # decode various parts of the slice values 

La elipsis es una sintaxis especial "ignorar esta dimensión" proporcionado a rodajas multidimensionales.

Ver también http://docs.python.org/library/itertools.html#itertools.islice para obtener más información.

21

Ellipsis se utiliza principalmente por la extensión numeric python, que añade un multidementional tipo de matriz. Dado que hay más de una dimensión, slicing se vuelve más complejo que solo un índice de inicio y detención; también es útil poder dividir en varias dimensiones. por ejemplo, dada una matriz de 4x4, la zona superior izquierda se definiría por la rebanada "[: 2,: 2]"

>>> a 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16]]) 

>>> a[:2,:2] # top left 
array([[1, 2], 
     [5, 6]]) 

Ellipsis se utiliza aquí para indicar un marcador de posición para el resto de las dimensiones de la matriz no especificado . Piense que indica la división completa [:] para las dimensiones no especificadas, por lo que para una matriz en 3D, a[...,0] es lo mismo que a[:,:,0] y para 4d, a[:,:,:,0].

Tenga en cuenta que el literal Ellipsis real (...) no se puede usar fuera de la sintaxis del segmento en python2, aunque hay un objeto Ellipsis incorporado. Esto es lo que significa "La conversión de un elemento de sector de puntos suspensivos es el objeto Ellipsis incorporado". es decir. "a[...]" es efectivamente azúcar para "a[Ellipsis]". En python3, ... denota elipsis en cualquier lugar, por lo que puede escribir:

>>> ... 
Ellipsis 

Si no se está usando numpy, se puede casi ignorar toda mención de la elipsis. Ninguno de los tipos incorporados lo usa, por lo que todo lo que tiene que importar es que las listas pasen un solo objeto de división, que contenga los miembros "start", "stop" y "step". es decir:

l[start:stop:step] # proper_slice syntax from the docs you quote. 

es equivalente a llamar:

l.__getitem__(slice(start, stop, step)) 
+1

La declaración "Tenga en cuenta que los puntos suspensivos real literal (...) no se puede utilizar fuera de la sintaxis de la rebanada en python2" no es del todo exacta. Puede usar "..." de la siguiente manera. a [3, ..., 5], dado que a es una instancia de clase que define __getitem __ (self, key). La afirmación correcta sería que Ellipsis no es utilizable fuera del operador de búsqueda de índice. – abc

+0

@abc: 'a [3, ..., 5]' es sintaxis de corte técnicamente. – user2357112

Cuestiones relacionadas