¿Cuál es el uso de la función incorporada slice
y cómo puedo usarlo?
La manera directa de cortar Pythonic lo sé - l1[start:stop:step]
. Quiero saber si tengo un objeto de corte, ¿cómo lo uso?Python slice how-to, conozco el segmento de Python, pero ¿cómo puedo usar un objeto de división integrado para él?
Respuesta
se crea una rebanada llamando rebanada con los mismos campos que usaría si al hacerlo [Inicio: Fin: paso] notación:
sl = slice(0,4)
Para utilizar la rebanada, sólo tiene que pasar como si fuera el índice en una lista o cadena:
>>> s = "ABCDEFGHIJKL"
>>> sl = slice(0,4)
>>> print(s[sl])
'ABCD'
Digamos que tiene un archivo de campos de texto de longitud fija. Podría definir una lista de sectores para extraer fácilmente los valores de cada "registro" en este archivo.
data = """\
0010GEORGE JETSON 12345 SPACESHIP ST HOUSTON TX
0020WILE E COYOTE 312 ACME BLVD TUCSON AZ
0030FRED FLINTSTONE 246 GRANITE LANE BEDROCK CA
0040JONNY QUEST 31416 SCIENCE AVE PALO ALTO CA""".splitlines()
fieldslices = [slice(*fielddef) for fielddef in [
(0,4), (4, 21), (21,42), (42,56), (56,58),
]]
fields = "id name address city state".split()
for rec in data:
for field,sl in zip(fields, fieldslices):
print("{} : {}".format(field, rec[sl]))
print('')
Prints:
id : 0010
name : GEORGE JETSON
address : 12345 SPACESHIP ST
city : HOUSTON
state : TX
id : 0020
name : WILE E COYOTE
address : 312 ACME BLVD
city : TUCSON
state : AZ
id : 0030
name : FRED FLINTSTONE
address : 246 GRANITE LANE
city : BEDROCK
state : CA
id : 0040
name : JONNY QUEST
address : 31416 SCIENCE AVE
city : PALO ALTO
state : CA
La función slice
devuelve slice objects. Los objetos Slice son uno de los tipos internos de Python, que están optimizados para el rendimiento de lectura: todos sus atributos son de solo lectura.
Alterar slice
podría ser útil si desea cambiar el comportamiento predeterminado. Por ejemplo, lxml
usa notación de división para acceder a los elementos DOM (sin embargo, no he confirmado cómo lo hicieron yo).
corchetes siguientes una secuencia denotan cualquiera de indexación o rebanado dependiendo de lo que está dentro de los corchetes:
>>> "Python rocks"[1] # index
'y'
>>> "Python rocks"[1:10:2] # slice
'yhnrc'
Ambos de estos casos son manejados por el método __getitem__()
de la secuencia (o __setitem__()
si está a la izquierda de un signo igual.) El índice o sector se pasa a los métodos como un único argumento, y t La forma en que Python lo hace es convirtiendo la notación de división, (1:10:2
, en este caso) en un objeto de división: slice(1,10,2)
.
Así que si va a definir su propia secuencia de la clase similar o anulando las __getitem__
o __setitem__
o __delitem__
métodos de otra clase, es necesario poner a prueba el argumento índice para determinar si es un int
o una slice
, y el proceso en consecuencia:
def __getitem__(self, index):
if isinstance(index, int):
... # process index as an integer
elif isinstance(index, slice):
start, stop, step = index.indices(len(self)) # index is a slice
... # process slice
else:
raise TypeError("index must be int or slice")
un objeto slice
tiene tres atributos: start
, stop
y step
, y un método: indices
, que toma un solo argumento, la longitud del objeto, y devuelve un 3-tupla: (start, stop, step)
.
>>> class sl:
... def __getitem__(self, *keys): print keys
...
>>> s = sl()
>>> s[1:3:5]
(slice(1, 3, 5),)
>>> s[1:2:3, 1, 4:5]
((slice(1, 2, 3), 1, slice(4, 5, None)),)
>>>
Consulte la respuesta de Don a continuación para obtener una explicación de por qué sucede esto. – abc
Sería beneficioso también señalar que puede haber varias divisiones pasadas a '__getitem__':' s [1: 2: 3, 1, 4: 5] => (slice (1, 2, 3), 1 , slice (4, 5, None)) '. – OozeMeister
- 1. Python Random Slice Idiom
- 2. ¿Por qué puedo actualizar un segmento de lista pero no un segmento de cadena en python?
- 3. Numpy: arr [..., 0 ,:] funciona. Pero, ¿cómo puedo almacenar los datos contenidos en el comando slice (..., 0, :)?
- 4. cuán rápido es el segmento de python
- 5. Python Slice Assignment Memory Usage
- 6. ¿Cómo aprendo Python 2 si ya conozco Python 3?
- 7. HOWTO: ¿Escribir el envoltorio API de Python?
- 8. Conozco el panorama general pero no puedo ponerlo en práctica
- 9. Python Array Slice With Comma?
- 10. [python]: ¿cómo implementar slice en python3?
- 11. python create slice object desde la cadena
- 12. python challenge, pero para C++
- 13. Aritmética básica de Python - división
- 14. python. obtener el tamaño de un objeto
- 15. Acceso explícito al alcance integrado de Python
- 16. ¿Cómo clonar un objeto generador de Python?
- 17. Portando Python a un sistema integrado
- 18. Cómo redondear el minuto de un objeto datetime python
- 19. ¿Cómo puedo limpiar correctamente un objeto de Python?
- 20. Python: ¿Hay un paquete integrado para analizar html en dom
- 21. ¿Cómo puedo usar Python para reemplazar caracteres de escape HTML?
- 22. ¿Cómo puedo usar un archivo DLL de Python?
- 23. ¿Cómo puedo usar el cambio de bit para reemplazar la división de enteros?
- 24. Cómo usar el tempfile.NamedTemporaryFile() de Python?
- 25. ¿Cómo puedo usar código común en python?
- 26. División de un archivo XML grande en Python
- 27. ¿Puedo evitar la modificación de un objeto en Python?
- 28. La división entera en Python
- 29. Cómo evitar que python integrado salga() de mi proceso
- 30. división de cadenas utilizando un delimitador en Python
esto funcionó para mí. def __slice __ (self, start = None, end = None, step = None): return self.obj [slice (inicio, fin, paso)] – user2290820