Tutorial 12, Comprensión y scrooling en listas.

Hola a tod@s, este ya es mi último post de hoy que ya tengo que hacer cosas, como veis los fines de semana escribo mas por que tengo mas tiempo libre.

En esta ocasión os voy a hablar sobre las listas mucho mas a fondo de lo que ya lo he hecho, hay dos conceptos importantes que tenéis que conocer sobre las listas, que son, la comprensión y el srooling, vamos a explicar detalladamente y con ejemplos cada uno de ellos.


Comprensión:

Este concepto se basa en generar una lista a través de otra lista, se que suena muy raro, pero no es para tanto y además es algo muy útil, este concepto lo a heredado de un lenguaje muy antiguo llamado Haskell que es completamente funcional.

La comprensión esta formada por:

-Una expresión a través de la cual se va a generar la lista
-Uno o varios for
-Y opcionalmente una o varias cláusulas if

Ejemplo:

l=[1, 2, 3, 4, 5]
l2=[n*2 for n in l]

Primero se escribe la expresión seguido de un for, es como mezclar las listas con los for, en este caso obtendríamos una lista llamada l2 con todos los valores de la lista l pero multiplicados por dos.

Ejemplo 2:

l=[1, 2, 3, 4, 5]
l2=[n*2 for n in l if n%2==0]

En este caso multiplicaría los elementos de la lista l por dos, tan sólo si son divisibles por dos.

Ejemplo 3:

l=[1, 2, 3, 4, 5]
l2=[n for n in l if n%2==0]

Este caso es igual que el anterior pero no los multiplica por dos, tan sólo los añade a la lista, simplificando la función filter que vimos en el anterior post.

Ahora vamos a ver que también se pueden encadenar for:

Ejemplo 4:

l1=[1, 2, 3]
l2=[4, 5, 6]
l3=[a*b for a in l1 for b in l2]

Ya sabéis que lo que devuelve todo esto son listas, que lo que hacemos es crear una lista a través de otra lista o un conjunto de ellas.

Y ya para que veáis bien la complejidad que puede llegar a tener esto, voy a poner un ejemplo combinando for e if:

Ejemplo 5:

l1=[8, 1, 7, 2]
l2=[7, 6, 1, 3]
l3=[5, 7, 1, 3]
lista=[a-b-c for a in l1 for b in l2 for c in l3 if a>=b and (a-b)>=c]

Lo que hace es intentar restar los valores de esas listas uno a uno, pero, solo si puede, es decir, primero intentaría restar "8-7-5", pero piensa, puedo restar 8-7, pero eso da 1 y a 1 no le puedo restar 5, entonces no lo resta, luego lo intenta con "8-6-5" y así con todas las combinaciones, cuando puede restarlo, lo resta y añade el valor a la lista "lista".

Scrooling (es aplicable tanto a listas como a tuplas):

El scrooling es un concepto que debería haber explicado antes, pero bueno aprovecho que estamos hablando sobre las listas, el scrooling significa hacer referencia solo a una parte de la lista y no a su totalidad, vosotr@s deberíais saber ya como se hace referencia a un valor en concreto de ella por que eso si lo expliqué:

Ejemplo 1:

lista=[1, 2, 3, 4, 5]
print "el tercer elemento de la lista es " + src(lista[2])

Esto ya lo deberíais de saber, bueno, pero....¿Y si yo quiero tomar desde el segundo elemento de la lista solo?, para eso existe el scrooling que se basa en especificar con ":" el inicio y el fin de lo que queremos tomar:

Ejemplo 2:

lista=[1, 2, 3, 4, 5]
print "los elementos de la lista a partir del segundo son " + src(lista[1:6])

He puesto hasta 6, por que la ultima posición que especificamos no se coje, es decir, si escribimos:

lista[0:4]
#coje desde la posición 0 hasta la posición 3

Entonces con el ejemplo 3, daría como resultado:

2, 3, 4, 5, 6

También podemos definirle que queremos que coja de una posición a otra pero haciendo saltos, es decir, de dos en dos, de tres en tres...

Ejemplo 3:
lista=[1, 2, 3, 4, 5, 6, 7, 8, 9]
print lista[2:8:2]

En este caso imprimiría por  pantalla:

3, 5, 7

Por que coje desde la posición 2 hasta la posición 8 (sin cojer esta) de dos en dos.

También hay una forma un poco mas simplificada de hacer este tipo de cosas, imagina que quieres coger de dos en dos todos los elementos de una lista, pues no hace falta que especifiques el inicio y el fin, tan solo déjalos en blanco y se aplican los valores por defecto:

Ejemplo 4:

lista=[1, 2, 3, 4, 5, 6, 7, 8, 9]
print lista[::2]

Cuando escribimos los dos puntos pero no escribimos un valor como es en este caso se usan los de defecto, que son así:

Valor de inicio: 0
Valor de final: El último elemento de la lista
Valor de iteración: 1

Ejemplo 5:

lista=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
print lista[2::2]

Pd: Ya sabéis que las listas empiezan a numerarse por 0 y no por 1.

Cogería desde el elemento 2 de la lista hasta el final de dos en dos, hasta el final por que hemos especificado los dos puntos, pero sin ningún valor, por eso coje el valor por defecto (los he aclarado todos arriba).

Bueno chic@s ya os he hablado sobre todo lo que os faltaba de listas, ya sabéis que el scrooling es completamente aplicable a las tuplas, pero la comprensión NO es aplicable a las tuplas, esa es la gran diferencia de la que os hablaba en el tutorial de listas tuplas y diccionarios.

Después de este interesante tutorial, me despido de tod@s vosotr@s, un abrazo a todos y hasta el siguiente tutorial, un abrazo.



4 comentarios:

Dan dijo...

parece, interesante y dificil. Buen trabajo Francisco

Francisco Dominguez Lerma dijo...

No es para nada complicado Daniel, tan sólo leelo detenidamente, gracias por comentar.

Un saludo.

Dr Coloso dijo...

Aca va unos ejemplos que hice.

http://pastebin.com/T9vgWhCR

Francisco Dominguez Lerma dijo...

Les he hechado un vistazo y están muy bien, sigue así.

Un saludo.