Necesito una buena explicación (las referencias son un plus) sobre la notación de corte de Python.
Para mí, esta notación necesita un poco de recuperación.
Parece extremadamente poderoso, pero aún no tengo la cabeza clara.
Es bastante simple realmente:
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
También está el step
valor, que se puede usar con cualquiera de los anteriores:
a[start:stop:step] # start through not past stop, by step
El punto clave a recordar es que el :stop
valor representa el primer valor que no está en el segmento seleccionado. Entonces, la diferencia entre stop
y start
es el número de elementos seleccionados (si step
es 1, el valor predeterminado).
La otra característica es que start
o stop
puede ser un número negativo , lo que significa que cuenta desde el final de la matriz en lugar del principio. Entonces:
a[-1] # last item in the array
a[-2:] # last two items in the array
a[:-2] # everything except the last two items
Del mismo modo, step
puede ser un número negativo:
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 es amable con el programador si hay menos elementos de los que pides. Por ejemplo, si solicita a[:-2]
y a
solo contiene un elemento, obtendrá una lista vacía en lugar de un error. A veces preferiría el error, por lo que debe tener en cuenta que esto puede suceder.
slice()
objetoEl operador de corte []
se está utilizando en el código anterior con un slice()
objeto que usa la :
notación (que solo es válida dentro []
), es decir:
a[start:stop:step]
es equivalente a:
a[slice(start, stop, step)]
Los objetos de segmento también se comportan de manera ligeramente diferente dependiendo del número de argumentos, de manera similar a range()
, es decir, a ambos slice(stop)
y slice(start, stop[, step])
son compatibles. Para omitir la especificación de un argumento dado, se podría usar None
, de modo que, por ejemplo, a[start:]
sea equivalente a[slice(start, None)]
o a[::-1]
sea equivalente a a[slice(None, None, -1)]
.
Si bien la :
notación basada en datos es muy útil para el corte simple, el uso explícito de slice()
objetos simplifica la generación programática de corte.
None
cualquiera de los espacios vacíos. Por ejemplo,[None:None]
hace una copia completa. Esto es útil cuando necesita especificar el final del rango usando una variable y necesita incluir el último elemento.del
hace la notación de corte de wrt? En particular,del arr[:]
no es inmediatamente obvio ("arr [:] hace una copia, ¿así que borra esa copia ???", etc.)El tutorial de Python habla sobre esto (desplácese hacia abajo un poco hasta llegar a la parte sobre el corte).
El diagrama de arte ASCII también es útil para recordar cómo funcionan los cortes:
fuente
a[-4,-6,-1]
que sea,yP
pero lo esty
. Lo que siempre funciona es pensar en caracteres o espacios y usar la indexación como un intervalo medio abierto: derecho abierto si es un paso positivo, izquierdo abierto si es un paso negativo.x[:0]
hace al comenzar desde el principio), por lo que debe hacer arreglos pequeños en casos especiales. : /Enumerando las posibilidades permitidas por la gramática:
Por supuesto, si
(high-low)%stride != 0
, entonces el punto final será un poco más bajo quehigh-1
.Si
stride
es negativo, el orden cambia un poco ya que estamos haciendo la cuenta regresiva:La división extendida (con comas y puntos suspensivos) se usa principalmente solo con estructuras de datos especiales (como NumPy); Las secuencias básicas no son compatibles.
fuente
repr
__getitem__
es; su ejemplo es equivalente aapple[slice(4, -4, -1)]
.Las respuestas anteriores no discuten la asignación de rebanadas. Para comprender la asignación de cortes, es útil agregar otro concepto al arte ASCII:
Una heurística es, para una porción de cero a n, pensar: "cero es el comienzo, comenzar desde el principio y tomar n elementos en una lista".
Otra heurística es, "para cualquier segmento, reemplace el inicio por cero, aplique la heurística anterior para obtener el final de la lista, luego cuente el primer número de nuevo para cortar los elementos desde el principio"
La primera regla de asignación de división es que, dado que la división devuelve una lista, la asignación de división requiere una lista (u otro iterable):
La segunda regla de la asignación de divisiones, que también puede ver arriba, es que cualquier porción de la lista se devuelve mediante la indexación de divisiones, esa es la misma porción que se cambia mediante la asignación de divisiones:
La tercera regla de asignación de divisiones es que la lista asignada (iterable) no tiene que tener la misma longitud; la porción indexada simplemente se corta y se reemplaza en masa por lo que se le asigne:
La parte más complicada para acostumbrarse es la asignación a sectores vacíos. Con la heurística 1 y 2 es fácil entender cómo indexar una porción vacía:
Y luego, una vez que haya visto eso, la asignación de la porción vacía también tiene sentido:
Tenga en cuenta que, dado que no estamos cambiando el segundo número del segmento (4), los elementos insertados siempre se apilan frente a la 'o', incluso cuando estamos asignando el segmento vacío. Entonces, la posición para la asignación de rebanada vacía es la extensión lógica de las posiciones para las asignaciones de rebanada no vacía.
Retrocediendo un poco, ¿qué sucede cuando continúas con nuestra procesión de contar el comienzo del corte?
Con rebanar, una vez que haya terminado, habrá terminado; No comienza a cortar hacia atrás. En Python no obtienes avances negativos a menos que los pidas explícitamente usando un número negativo.
Hay algunas consecuencias extrañas a la regla "una vez que hayas terminado, hayas terminado":
De hecho, en comparación con la indexación, el corte en Python es extrañamente a prueba de errores:
Esto puede ser útil a veces, pero también puede conducir a un comportamiento algo extraño:
Dependiendo de su aplicación, eso podría ... o no ... ¡ser lo que esperaba allí!
A continuación se muestra el texto de mi respuesta original. Ha sido útil para muchas personas, por lo que no quería eliminarlo.
Esto también puede aclarar la diferencia entre cortar e indexar.
fuente
En resumen, los dos puntos (
:
) en la notación de subíndice (subscriptable[subscriptarg]
) marca la notación de corte - que tiene los argumentos opcionales,start
,stop
,step
:El corte en Python es una forma computacionalmente rápida de acceder metódicamente a partes de sus datos. En mi opinión, para ser incluso un programador intermedio de Python, es un aspecto del lenguaje con el que es necesario estar familiarizado.
Definiciones importantes
Para empezar, definamos algunos términos:
Cómo funciona la indexación
Puedes hacer cualquiera de estos números positivos o negativos. El significado de los números positivos es sencillo, pero para los números negativos, al igual que los índices en Python, cuentas hacia atrás desde el final para el inicio y el final , y para el paso , simplemente disminuyes tu índice. Este ejemplo es del tutorial de la documentación , pero lo he modificado ligeramente para indicar a qué elemento de una secuencia hace referencia cada índice:
Cómo funciona el corte
Para usar la notación de corte con una secuencia que lo admita, debe incluir al menos dos puntos en los corchetes que siguen a la secuencia (que en realidad implementan el
__getitem__
método de la secuencia, de acuerdo con el modelo de datos de Python ).La notación de corte funciona así:
Y recuerde que hay valores predeterminados para inicio , detención y paso , por lo que para acceder a los valores predeterminados, simplemente omita el argumento.
La notación de corte para obtener los últimos nueve elementos de una lista (o cualquier otra secuencia que lo soporte, como una cadena) se vería así:
Cuando veo esto, leo la parte entre paréntesis como "noveno desde el final hasta el final". (En realidad, lo abrevio mentalmente como "-9, en")
Explicación:
La notación completa es
y para sustituir los valores predeterminados (en realidad, cuando
step
es negativo,stop
el valor predeterminado es-len(my_list) - 1
,None
por lo que para detener realmente solo significa que va a cualquier paso final que lo lleve):El colon ,
:
es lo que le dice a Python que le está dando una porción y no un índice regular. Es por eso que la forma idiomática de hacer una copia superficial de listas en Python 2 esY limpiarlos es con:
(Python 3 obtiene un método
list.copy
ylist.clear
).Cuando
step
es negativo, los valores predeterminadosstart
ystop
cambianPor defecto, cuando el
step
argumento está vacío (oNone
), se le asigna+1
.Pero puede pasar un número entero negativo, y la lista (o la mayoría de los otros slicables estándar) se dividirá desde el final hasta el principio.
Por lo tanto, un segmento negativo cambiará los valores predeterminados para
start
ystop
!Confirmando esto en la fuente
Me gusta animar a los usuarios a leer la fuente y la documentación. El código fuente para los objetos de corte y esta lógica se encuentra aquí . Primero determinamos si
step
es negativo:Si es así, el límite inferior
-1
significa que dividimos todo el camino hasta el principio e incluido, y el límite superior es la longitud menos 1, lo que significa que comenzamos al final. (Tenga en cuenta que la semántica de esto-1
es diferente de la-1
que los usuarios pueden pasar índices en Python que indican el último elemento).De
step
lo contrario, es positivo, y el límite inferior será cero y el límite superior (que subiremos pero no incluiremos) la longitud de la lista dividida.Entonces, es posible que necesitemos aplicar los valores predeterminados para
start
ystop
- el valor predeterminado para entoncesstart
se calcula como el límite superior cuandostep
es negativo:y
stop
, el límite inferior:¡Dale a tus rebanadas un nombre descriptivo!
Puede resultarle útil separar la formación de la porción de pasarla al
list.__getitem__
método ( eso es lo que hacen los corchetes ). Incluso si no es nuevo, mantiene su código más legible para que otros que tengan que leer su código puedan comprender más fácilmente lo que está haciendo.Sin embargo, no puede simplemente asignar algunos enteros separados por dos puntos a una variable. Necesita usar el objeto de corte:
Se
None
requiere el segundo argumento, para que el primer argumento se interprete como elstart
argumento, de lo contrario sería elstop
argumento .Luego puede pasar el objeto de corte a su secuencia:
Es interesante que los rangos también tomen porciones:
Consideraciones de memoria:
Dado que las secciones de las listas de Python crean nuevos objetos en la memoria, otra función importante a tener en cuenta es
itertools.islice
. Por lo general, querrá iterar sobre un segmento, no solo crearlo estáticamente en la memoria.islice
es perfecto para esto Una advertencia, no admite argumentos negativos parastart
,stop
ostep
, por lo que si ese es un problema, es posible que deba calcular índices o revertir el iterable de antemano.y ahora:
El hecho de que las secciones de la lista hagan una copia es una característica de las listas mismas. Si está cortando objetos avanzados como un Pandas DataFrame, puede devolver una vista del original y no una copia.
fuente
Y un par de cosas que no eran obvias para mí cuando vi por primera vez la sintaxis de corte:
¡Manera fácil de invertir secuencias!
Y si desea, por alguna razón, cada segundo elemento en la secuencia inversa:
fuente
En Python 2.7
Cortando en Python
Comprender la asignación de índice es muy importante.
Cuando dices [a: b: c], estás diciendo dependiendo del signo de c (hacia adelante o hacia atrás), comienza en a y termina en b (excluyendo el elemento en el índice bth). Use la regla de indexación anterior y recuerde que solo encontrará elementos en este rango:
Pero este rango continúa en ambas direcciones infinitamente:
Por ejemplo:
Si su elección de a, byc permite la superposición con el rango anterior a medida que recorre usando las reglas para a, b, c arriba, obtendrá una lista con elementos (tocada durante el recorrido) o obtendrá una lista vacía.
Una última cosa: si ayb son iguales, entonces también obtienes una lista vacía:
fuente
a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; a[:-2:-2]
que resulta a[9]
Encontré esta gran tabla en http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
fuente
Después de usarlo un poco, me doy cuenta de que la descripción más simple es que es exactamente lo mismo que los argumentos en un
for
bucle ...Cualquiera de ellos es opcional:
Luego, la indexación negativa solo necesita que agregue la longitud de la cadena a los índices negativos para comprenderla.
Esto me funciona de todos modos ...
fuente
Me resulta más fácil recordar cómo funciona, y luego puedo descubrir cualquier combinación específica de inicio / parada / paso.
Es instructivo entender
range()
primero:Comience desde
start
, incremente porstep
, no alcancestop
. Muy simple.Lo que hay que recordar sobre el paso negativo es que
stop
siempre es el final excluido, ya sea más alto o más bajo. Si desea el mismo corte en orden opuesto, es mucho más limpio hacer la inversión por separado: por ejemplo,'abcde'[1:-2][::-1]
corta un carbón desde la izquierda, dos desde la derecha y luego invierte. (Ver tambiénreversed()
)El corte de secuencia es el mismo, excepto que primero normaliza los índices negativos y nunca puede salir de la secuencia:
TODO : El siguiente código tenía un error con "nunca salir de la secuencia" cuando abs (paso)> 1; Creo que lo parcheé para que sea correcto, pero es difícil de entender.
No se preocupe por los
is None
detalles, solo recuerde que omitirstart
y / ostop
siempre hace lo correcto para darle toda la secuencia.La normalización de los índices negativos primero permite que el inicio y / o la detención se cuenten desde el final de forma independiente: a
'abcde'[1:-2] == 'abcde'[1:3] == 'bc'
pesar derange(1,-2) == []
. La normalización a veces se considera como "módulo de la longitud", pero tenga en cuenta que agrega la longitud solo una vez: por ejemplo,'abcde'[-53:42]
es solo la cadena completa.fuente
this_is_how_slicing_works
no es lo mismo que el segmento de python. EG[0, 1, 2][-5:3:3]
obtendrá [0] en python, perolist(this_is_how_slicing_works([0, 1, 2], -5, 3, 3))
obtendrá [1].range(4)[-200:200:3] == [0, 3]
perolist(this_is_how_slicing_works([0, 1, 2, 3], -200, 200, 3)) == [2]
. Miif 0 <= i < len(seq):
intento de implementar "nunca salga de la secuencia" simplemente pero está mal para el paso> 1. Lo reescribiré más tarde hoy (con pruebas).Utilizo el método de "puntos de índice entre elementos" para pensarlo yo mismo, pero una forma de describirlo que a veces ayuda a otros a entenderlo es esta:
X es el índice del primer elemento que desea.
Y es el índice del primer elemento que no desea.
fuente
Espero que esto te ayude a modelar la lista en Python.
Referencia: http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
fuente
Notación de corte de Python:
start
yend
, los valores negativos se interpretan como relativos al final de la secuencia.end
indican la posición después del último elemento que se incluirá.[+0:-0:1]
.start
yend
La notación se extiende a matrices (numpy) y matrices multidimensionales. Por ejemplo, para cortar columnas enteras puede usar:
Los sectores contienen referencias, no copias, de los elementos de la matriz. Si desea hacer una copia separada de una matriz, puede usarla
deepcopy()
.fuente
También puede usar la asignación de divisiones para eliminar uno o más elementos de una lista:
fuente
Esto es solo para obtener información adicional ... Considere la lista a continuación
Algunos otros trucos para revertir la lista:
fuente
Así es como enseño rebanadas a los novatos:
Comprender la diferencia entre indexación y segmentación:
Wiki Python tiene esta increíble imagen que distingue claramente la indexación y el corte.
Es una lista con seis elementos. Para entender mejor el corte, considere esa lista como un conjunto de seis cajas juntas. Cada caja tiene un alfabeto en ella.
La indexación es como tratar con el contenido de la caja. Puede verificar el contenido de cualquier casilla. Pero no puede verificar el contenido de varias cajas a la vez. Incluso puede reemplazar el contenido de la caja. Pero no puede colocar dos bolas en una caja o reemplazar dos bolas a la vez.
Rebanar es como tratar con cajas en sí. Puede levantar la primera caja y colocarla en otra mesa. Para recoger el cuadro, todo lo que necesita saber es la posición de inicio y finalización del cuadro.
Incluso puede recoger los primeros tres cuadros o los dos últimos cuadros o todos los cuadros entre 1 y 4. Por lo tanto, puede elegir cualquier conjunto de cuadros si conoce el principio y el final. Estas posiciones se denominan posiciones de inicio y parada.
Lo interesante es que puede reemplazar varias cajas a la vez. También puedes colocar múltiples cajas donde quieras.
Cortando con paso:
Hasta ahora has elegido cajas continuamente. Pero a veces necesitas recoger discretamente. Por ejemplo, puede recoger cada segundo cuadro. Incluso puede recoger cada tercer cuadro desde el final. Este valor se llama tamaño de paso. Esto representa la brecha entre sus recogidas sucesivas. El tamaño del paso debe ser positivo si está seleccionando cuadros de principio a fin y viceversa.
Cómo Python descubre los parámetros perdidos:
Al dividir, si omite algún parámetro, Python intenta resolverlo automáticamente.
Si verifica el código fuente de CPython , encontrará una función llamada PySlice_GetIndicesEx () que calcula los índices de un segmento para cualquier parámetro dado. Aquí está el código equivalente lógico en Python.
Esta función toma un objeto Python y parámetros opcionales para segmentar y devuelve el inicio, la detención, el paso y la longitud del segmento para el segmento solicitado.
Esta es la inteligencia que está presente detrás de las rebanadas. Dado que Python tiene una función incorporada llamada slice, puede pasar algunos parámetros y verificar qué tan inteligentemente calcula los parámetros faltantes.
Nota: Esta publicación se escribió originalmente en mi blog, The Intelligence Behind Python Slices .
fuente
Como regla general, escribir código con muchos valores de índice codificados conduce a un lío de legibilidad y mantenimiento. Por ejemplo, si vuelve al código un año después, lo mirará y se preguntará qué estaba pensando cuando lo escribió. La solución que se muestra es simplemente una forma de establecer más claramente lo que su código está haciendo realmente. En general, el sector integrado () crea un objeto de sector que se puede utilizar en cualquier lugar donde se permita un sector. Por ejemplo:
Si tiene una instancia de segmento s, puede obtener más información al mirar sus atributos s.start, s.stop y s.step, respectivamente. Por ejemplo:
fuente
1. Notación de corte
Para simplificar, recuerde que la rebanada solo tiene una forma:
y así es como funciona:
s
: un objeto que puede ser cortadostart
: primer índice para iniciar la iteraciónend
: último índice, TEN EN CUENTA que elend
índice no se incluirá en el segmento resultantestep
: elija elemento cadastep
índiceOtra cosa importación: todos
start
,end
,step
se puede omitir! Y si se omiten, su valor por defecto será usada:0
,len(s)
,1
en consecuencia.Entonces las posibles variaciones son:
NOTA: Si
start >= end
(considerando solo cuándostep>0
), Python devolverá un segmento vacío[]
.2. Errores
La parte anterior explica las características principales sobre cómo funciona el corte, y funcionará en la mayoría de las ocasiones. Sin embargo, puede haber dificultades que debe tener cuidado, y esta parte las explica.
Índices negativos
¡Lo primero que confunde a los estudiantes de Python es que un índice puede ser negativo! No entre en pánico: un índice negativo significa contar hacia atrás.
Por ejemplo:
Paso negativo
¡Hacer las cosas más confusas también
step
puede ser negativo!Un paso negativo significa iterar la matriz hacia atrás: desde el final hasta el inicio, con el índice final incluido y el índice inicial excluido del resultado.
NOTA : cuando el paso es negativo, el valor predeterminado para
start
eslen(s)
(mientras queend
no es igual a0
, porques[::-1]
contienes[0]
). Por ejemplo:Error fuera de rango?
Sorpréndase : ¡el sector no genera un IndexError cuando el índice está fuera de rango!
Si el índice está fuera de rango, Python hará todo lo posible para establecer el índice
0
olen(s)
según la situación. Por ejemplo:3. Ejemplos
Terminemos esta respuesta con ejemplos, explicando todo lo que hemos discutido:
fuente
Las respuestas anteriores no discuten el corte de matriz multidimensional que es posible usando el famoso paquete NumPy :
La división también se puede aplicar a matrices multidimensionales.
El "
:2
" antes de que la coma opere en la primera dimensión y el "0:3:2
" después de que la coma opere en la segunda dimensión.fuente
list
sino soloarray
en NumpyPuede ejecutar este script y experimentar con él, a continuación hay algunas muestras que obtuve del script.
Cuando utilice un paso negativo, observe que la respuesta se desplaza a la derecha por 1.
fuente
Mi cerebro parece feliz de aceptar que
lst[start:end]
contiene elstart
enésimo elemento. Incluso podría decir que es una 'suposición natural'.Pero ocasionalmente aparece una duda y mi cerebro me pide que me asegure que no contiene el
end
elemento -th.En estos momentos confío en este simple teorema:
Esta bonita propiedad me dice que
lst[start:end]
no contiene elend
elemento -th porque está enlst[end:]
.Tenga en cuenta que este teorema es verdadero para cualquiera
n
. Por ejemplo, puedes verificar quevuelve
True
.fuente
En mi opinión, comprenderá y memorizará mejor la notación de corte de cadena de Python si la mira de la siguiente manera (siga leyendo).
Trabajemos con la siguiente cadena ...
Para aquellos que no saben, puede crear cualquier subcadena
azString
utilizando la notaciónazString[x:y]
Viniendo de otros lenguajes de programación, es cuando el sentido común se ve comprometido. ¿Qué son x e y?
Tuve que sentarme y ejecutar varios escenarios en mi búsqueda de una técnica de memorización que me ayudará a recordar qué son x e y y me ayudará a cortar las cadenas correctamente en el primer intento.
Mi conclusión es que x e y deben verse como los índices de límite que rodean las cadenas que queremos agregar. Entonces deberíamos ver la expresión como
azString[index1, index2]
o incluso más clara comoazString[index_of_first_character, index_after_the_last_character]
.Aquí hay un ejemplo de visualización de eso ...
Entonces, todo lo que tiene que hacer es establecer index1 e index2 a los valores que rodearán la subcadena deseada. Por ejemplo, para obtener la subcadena "cdefgh", puede usar
azString[2:8]
, porque el índice en el lado izquierdo de "c" es 2 y el del tamaño correcto de "h" es 8.Recuerda que estamos estableciendo los límites. Y esos límites son las posiciones donde podría colocar algunos soportes que se envolverán alrededor de la subcadena de esta manera ...
ab [ cdefgh ] ij
Ese truco funciona todo el tiempo y es fácil de memorizar.
fuente
La mayoría de las respuestas anteriores aclara las preguntas sobre la notación de corte.
La sintaxis de indexación extendida utilizada para segmentar es
aList[start:stop:step]
, y los ejemplos básicos son::
Más ejemplos de corte: 15 rebanadas extendidas
fuente
En Python, la forma más básica para cortar es la siguiente:
donde
l
hay alguna colección,start
es un índice inclusivo yend
es un índice exclusivo.Al dividir desde el principio, puede omitir el índice cero, y al dividir hasta el final, puede omitir el índice final ya que es redundante, así que no sea detallado:
Los enteros negativos son útiles cuando se realizan desplazamientos relativos al final de una colección:
Es posible proporcionar índices que están fuera de los límites al cortar, tales como:
Tenga en cuenta que el resultado de cortar una colección es una colección completamente nueva. Además, cuando se usa la notación de corte en las asignaciones, la longitud de las asignaciones de corte no necesita ser la misma. Los valores antes y después del segmento asignado se mantendrán, y la colección se reducirá o crecerá para contener los nuevos valores:
Si omite el índice de inicio y finalización, hará una copia de la colección:
Si se omiten los índices de inicio y fin cuando se realiza una operación de asignación, todo el contenido de la colección se reemplazará con una copia de lo que se hace referencia:
Además del corte básico, también es posible aplicar la siguiente notación:
donde
l
es una colección,start
es un índice inclusivo,end
es un índice exclusivo ystep
es un paso que se puede utilizar para incorporar cada enésimo elementol
.Usar
step
proporciona un truco útil para revertir una colección en Python:También es posible usar enteros negativos para
step
el siguiente ejemplo:Sin embargo, usar un valor negativo para
step
podría ser muy confuso. Por otra parte, con el fin de ser Pythonic , debe evitarse el usostart
,end
ystep
en una sola rebanada. En caso de que sea necesario, considere hacer esto en dos tareas (una para cortar y la otra para avanzar).fuente
Quiero agregar uno ¡Hola Mundo! ejemplo que explica los conceptos básicos de las rebanadas para los principiantes. Me ayudó mucho.
Tengamos una lista con seis valores
['P', 'Y', 'T', 'H', 'O', 'N']
:Ahora los sectores más simples de esa lista son sus sublistas. La notación es
[<index>:<index>]
y la clave es leerlo así:Ahora, si haces una porción
[2:5]
de la lista anterior, esto sucederá:Hiciste un corte antes del elemento con índice
2
y otro corte antes del elemento con índice5
. Entonces, el resultado será un corte entre esos dos cortes, una lista['T', 'H', 'O']
.fuente
Personalmente lo pienso como un
for
bucle:Además, tenga en cuenta que los valores negativos para
start
yend
son relativos al final de la lista y se calculan en el ejemplo anterior porgiven_index + a.shape[0]
.fuente
El siguiente es el ejemplo de un índice de una cadena:
Ejemplo de corte: [inicio: fin: paso]
A continuación se muestra el uso de ejemplo:
fuente
Si siente que los índices negativos en el corte es confuso, aquí hay una manera muy fácil de pensarlo: simplemente reemplace el índice negativo con
len - index
. Entonces, por ejemplo, reemplace -3 conlen(list) - 3
.La mejor manera de ilustrar lo que hace el corte interno es simplemente mostrarlo en el código que implementa esta operación:
fuente
La técnica básica de corte es definir el punto de partida, el punto de parada y el tamaño del paso, también conocido como zancada.
Primero, crearemos una lista de valores para usar en nuestro corte.
Crea dos listas para cortar. La primera es una lista numérica del 1 al 9 (Lista A). La segunda también es una lista numérica, de 0 a 9 (Lista B):
Indice el número 3 de A y el número 6 de B.
Rebanado Básico
La sintaxis de indexación extendida utilizada para segmentar es aList [start: stop: step]. El argumento de inicio y el argumento de paso están predeterminados en ninguno: el único argumento requerido es detener. ¿Notó que esto es similar a cómo se usó el rango para definir las listas A y B? Esto se debe a que el objeto de división representa el conjunto de índices especificados por rango (inicio, detención, paso). Documentación de Python 3.4.
Como puede ver, definir solo stop devuelve un elemento. Dado que el inicio por defecto es ninguno, esto se traduce en recuperar solo un elemento.
Es importante tener en cuenta que el primer elemento es el índice 0, no el índice 1. Es por eso que estamos utilizando 2 listas para este ejercicio. Los elementos de la Lista A están numerados de acuerdo con la posición ordinal (el primer elemento es 1, el segundo elemento es 2, etc.) mientras que los elementos de la Lista B son los números que se usarían para indexarlos ([0] para el primer elemento 0, etc.)
Con la sintaxis de indexación extendida, recuperamos un rango de valores. Por ejemplo, todos los valores se recuperan con dos puntos.
Para recuperar un subconjunto de elementos, es necesario definir las posiciones de inicio y detención.
Dado el patrón aList [inicio: detener], recupere los dos primeros elementos de la Lista A.
fuente
No creo que el diagrama del tutorial de Python (citado en varias otras respuestas) sea bueno ya que esta sugerencia funciona para un paso positivo, pero no para un paso negativo.
Este es el diagrama:
Desde el diagrama, espero
a[-4,-6,-1]
que sea,yP
pero lo esty
.Lo que siempre funciona es pensar en caracteres o ranuras y usar la indexación como un intervalo medio abierto: abierto a la derecha si es un paso positivo, a la izquierda si es un paso negativo.
De esta manera, se me ocurre
a[-4:-6:-1]
quea(-6,-4]
en la terminología de intervalo.fuente