miércoles, 26 de febrero de 2014

Python basico II, slices



Hay una forma cómoda de extraer elementos de una lista, se trata de las extended slices, similares las operaciones para acceder a los elementos de una matriz en Matlab o en numpy. La notación es como sigue, siendo "a" una lista, una tupla o un string:

  • a[start:end] -> Lista los elementos a partir de  la posición start, sin incluir, hasta end, es decir, matemáticamente (start,end].
  • a[start:] -> A partir de start, sin incluir, hasta el final de la lista, es decir (start, final_lista] en matemáticas.
  • a[:end] -> Desde el comienzo de la lista hasta el final.
  • a[:] -> Todo el array.
Los valores de star y end pueden ser negativos, en ese caso el comportamiento varia ligeramente, los siguientes ejemplos son clarificadores:

>>> a = [1,2,3,4,5]
>>> a[-1]
5
>>> a[-2]
4

Los resultados explican su comportamiento, que resulta muy intuitivo.

>>> a[-2:]
[4, 5]
>>> a[-3:]
[3, 4, 5]
Si se quieren sacar todos los valores menos los n últimos, se emplea a[:-n], es decir:


>>> a[:-1]
[1, 2, 3, 4]
>>> a[:-4]
[1]

Desde la versión 1.4 de Python se puede añadir un tercer termino, el paso o step. Con esta nomenclatura tenemos a[start: end: step]. Algunos ejemplos:


>>> b = range(1,10)
>>> b
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b[0:9:2]
[1, 3, 5, 7, 9]
>>> b[::2]
[1, 3, 5, 7, 9]
Obsérvese la equivalencia de las dos últimas expresiones.  También se pueden usar expresiones negativas en el step, en ese caso el proceso se realiza desde el fina hasta el principio:

>>> b[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> b[::-2]
[9, 7, 5, 3, 1]

También podemos hacer asignación.

>>> c = [1,2]
>>> c[1:3] = [-1,-2,-3]
>>> c
[1, -1, -2, -3]

Las posibilidades son numerosas y muy flexibles:

>>> d = range(0,5)
>>> d
[0, 1, 2, 3, 4]
>>> d[2::2]
[2, 4]
>>> d[2::2] = [0,0]
>>> d
[0, 1, 0, 3, 0]

También permite eliminar elementos de forma selectiva:

>>> z = range(1,10)
>>> z
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del z[::2]
>>> z
[2, 4, 6, 8]
>>> 


En la siguiente entrada de Python básico continuo con el tema de las funciones anónimas.

No hay comentarios:

Publicar un comentario