Bienvenidos sean a este post, hoy hablaremos sobre un modulo que posee herramientas para iteraciones, veamos que nos dice la documentacion oficial:
Este módulo implementa una serie de bloques de construcción de iteradores inspirados en construcciones de APL, Haskell y SML. Cada uno ha sido rediseñado en una forma adecuada para Python. El módulo estandariza un conjunto básico de herramientas rápidas y eficientes en memoria que son útiles por sí mismas o en combinación. Juntos, forman un “álgebra de iteradores” que hace posible construir herramientas especializadas de manera sucinta y eficiente en Python puro.
Guido van Rossum
Iteradores infinitos
Este iterador se llama count y nos permite hacer que un for trabaje como un while o un bucle infinito, veamos un ejemplo:
>>> from itertools import count
>>> for n in count(5, 3) :
... if n > 20:
... break
... print(n, end=', ')
...
5, 8, 11, 14, 17, 20, >>>
Como siempre debemos importar el modulo del paquete itertools, luego usamos un for donde el objeto n recibira el valor del iterador count, esta funcion recibira dos valores: el primero sera desde donde comenzara a contar y el segundo sera para la incrementacion, el problema de trabajar con este modulo es que si no lo detenemos con un break seguira contando hasta el infinito, por esta razon en el bloque del for agregamos un condicional donde si n es mayor que 20 llama a break de lo contrario imprimira los valores en pantalla pero con una curiosidad, en este caso agregamos un end despues de la coma, este atributo nos permite reemplazar el caracter de nueva linea por una coma, esto hara que se muestre un valor detras del otro separados por comas, observen la salida, esta funcion puede ser util cuando necesitemos hacer un bucle pero no sabemos cuan largo lo queremos o necesitamos y podemos definir su corte por medio de una condicion.
Iteradores que terminan en la secuencia de entrada más corta
Este es un iterador muy «iteresante» porque nos permite crear uno basado en varios iteradores combinando sus valores de acuerdo a cierta logica, el punto clave entre todos estos iteradores es que si alguno de ellos es mas corto que el resto dara como resultado un iterador que no se rompera sino que simplemente se detendra cuando finalice el iterador mas corto, veamos un ejemplo:
compress.py
from itertools import compress
datos = range(10)
selector_par = [1,0] * 10
selector_impar = [0,1] * 10
numeros_pares = list(compress(datos, selector_par))
numeros_impares = list(compress(datos, selector_impar))
print(selector_par)
print(list(datos))
print(numeros_pares)
print(numeros_impares)
Primero importamos a la herramienta encargada de la magia como es compress, luego crearemos tres variables, la primera sera uno que contendra un rango de 10 numeros, la siguiente sera utilizada para seleccionar los numeros pares (selector_par) y la ultima sera para los numeros impares (selector_impar), ahora veremos como haremos toda la operacion, en este caso datos tendra un tamaño de 10 elementos pero los otros dos tienen un tamaño de 20 elementos, aqui veremos como trabaja.
Lo siguiente sera crear dos variables que usaremos para almacenar los numeros pares (numeros_pares) y otros para almacenar los numeros impares (numeros_impares) respectivamente pero como hara esto? Veamos, primero lo crearemos como list, luego usamos compress, esta funcion trabaja de la siguiente forma: primero debemos pasar la lista que comprimiremos y luego una lista que solo posee 1 o 0, estos se encargaran de tomar el valor que coincida con el uno y omitir los que coincidan con 0, por esta razon pasamos cada selector y por ello si observan los selectores al principio veran que cada orden nos posibilitara esto, con todo esto realizado despues tenemos una linea para mostrar a uno de los selectores, luego mostramos a datos y por ultimo vemos como se separaron los numeros pares e impares en las dos variables, ejecutemos el codigo y veamos la salida:
tinchicus@dbn001vrt:~/python$ python3 compress.py
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[1, 3, 5, 7, 9]
tinchicus@dbn001vrt:~/python$
Vean como son los dos primeros datos que usaremos en compress, despues podemos ver el resultado de los compress, como pueden ver trabajo hasta donde llego con nuestra lista llamada datos y no nos devolvio ningun error.
Generadores combinatorios
Este iterador llamado permutations nos permitira hacer lo que indica su nombre, permutaciones pero que es una permutacion? Veamos:
Una permutación, también denominada «número de disposición» u «orden», es una reorganización de los elementos de una lista ordenada S en una correspondencia uno a uno con la propia S.
Wolfram Mathworld
Por ejemplo vamos a tomar un texto de ejemplo, ABC, el cual sabemos que posee una permutacion de seis combinaciones posibles, esto lo sabemos gracias al factoreo de la cantidad de caracteres:
3! = 3 * 2 * 1 = 6
Para ver como funciona vamos a utilizar el siguiente codigo:
>>> from itertools import permutations
>>> print(list(permutations("ABC")))
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
>>>
Observen como nos genero todas las combinaciones posibles pero con este iterador tengan cuidado porque a mayor cantidad puede generar un numero mucho mas grande de manera muy rapida derivando en inconvenientes de memoria.
En resumen hoy hemos visto al paquete itertools y algunos de los modulos mas interesantes, el primero para poder hacer un conteo infinito y poder convertir a for en un bucle infinito o por lo menos que se detenga por nosotros, el segundo es un compresor de una lista por medio de otra pero que se detiene con la lista mas corta y por ultimo vimos uno que nos permite ejecutar permutaciones sobre alguna combinacion de caracteres, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
