Aviso de cookies

Estoy de acuerdo Este sitio web guarda pequeños fragmentos de información (cookies) en su dispositivo con la finalidad de ofrecer un mejor contenido y para finalidades estadísticas. Usted puede desactivar el uso de cookies modificando la configuración de su navegador. Navegar por nuestro sitio web sin cambiar la configuración del navegador hace que usted nos esté autorizando a guardar esta información en su dispositivo.

Listas por compresión en Python

8 de Mayo de 2012 a las 01:00| programacion , python

Python proporciona diferentes tipos de estructuras de datos, una de las estructuras mas utilizadas son las listas que nos permiten almacenar un conjunto de elementos de diferentes tipos. Cada elemento de una lista se le asigna un indice numérico que indica la posición del elemento, un elemento de una lista esta compuesto por un índice,que indica una posición, y  un valor. Toda lista se debe identificar por un nombre, un ejemplo de lista.

Lista=["hola",4,5,[2,3]]

Como vemos en el ejemplo anterior, se ha creado una lista denominada Lista que contiene  4 elementos, cada elemento se le asigna una posición (índice) que comienza por la posición 0, que corresponde al valor "hola".  Este post no hablara de como crear listas y las diferentes operaciones que podemos aplicar,  se explicara una forma de crear listas muy potente y compacta que se denomina Listas por compresión.

Una lista por compresión crea una lista a partir de otra lista, con lo que necesita una lista que modifica para devolver otra lista.

Una lista de compresión esta compuesta por varios elementos:

  • Un bucle  que recorre los elementos de la lista.
  • Definición de los elementos de la lista por compresión.
  • Un condicional (opcional) que especifica si los elementos de la lista por compresión deben cumplir alguna condición.
  • Nombre de la lista que devolverá.

Un ejemplo

Tenemos una lista, Numeros=[2,3,4,5,6] creamos una lista por compresión que nos devuelva una lista con todos los valores al cuadrado.

ListaCuadrado=[x**2 for x in Numeros]

Si utilizamos un condicional podemos especificar que elementos de la lista Numeros se escogen.

print(listaCuadrado)
[16,25,36]

Con las listas por compresión podemos definir listas complejas en una sola línea, veamos 3 ejemplos donde podemos ver la potencia de las listas por compresión.

Ejemplo 1

Tenemos una lista de números y una lista de números que representan indices , crear una lista con los valores que se encuentran en la posición que indica esos indices.

listaNumero=[1,2,8,2,3,4,7,1] listaIndice[2,5]

lista que devuelve listaResultado=[8,4]

listaResultado=[listaNumeros[i] for i in listaIndice]

Ejemplo 2

Tenemos una lista de números y una variable numérica denominada nElementos. Dividir la lista en sublistas con tantos elementos como lo especificado en la variable nElementos. Se debe mostrar la nueva lista compuesta de varias sublistas.

 ListaNumeros = [2,5,4,3,7,3,2,5,8,1]

 y nElementos=2

 La lista se convierte en [[2,5], [4,3], [7,3], [2,5], [8,1]]

lista=[5,1,5,6,7,3,6,2,9]
Elementos=int(input("Escribe el numero de elementos de las sublistas:\n"))
listaR=[lista[i:i+nElementos] for i in range(0,len(lista),nElementos)]
print(listaR)

En la lista por compresión tenemos un bucle que recorre mediante un rango desde 0 hasta la longitud de la lista, con un incremento especificado por la variable nElmentos, para especificar las sublistas tomamos las posiciones de la lista sumando el valor de i  mas el valor de elementos. Por ejemplo si nElementos fuese 2, la primera sublista seria lista[0:2] con lo que especificamos los elementos de la posición 0 hasta la posición 2, en función del valor que toma se van generando las posiciones que incluyen cada sublista.

Ejemplo 3

Tenemos una listaA de números y otra listaB de números , buscar en la primera lista los elementos especificados en la segunda lista. Debemos mostrar una lista donde se almacenan el índice de los elementos encontrados.

 

 Tenemos la listaA [1,4,1,4,6,5,5,5,4,2,3]

la otra listaB [1,3,5] y buscar en la primera lista los elementos 1,3 y 5.

La lista resultado sera

[[0, 2], [10], [5, 6, 7]]

Cada elemento sera una sublista con las posiciones de los elementos encontrados.

listaA=[1,4,1,4,6,5,5,5,4,2,3]
listaB=[1,3,5]
listaR=[[i for i, x in enumerate(listaA) if x == e]for e in listaB]
print(listaR)

En este ejemplo se utiliza la función enumerate que nos permite obtener el indice junto a su valor. Primero recorremos los valores de listaB compara valores de las dos listas y con la  función enumerate escoge el indice de aquellos valores encontrados.

Con las listas por compresión podemos ahorranos muchas lineas de código, como contrapartida el código generado puede resultar algo confuso, aunque es muy recomendable su uso. Para otro tipo de estructuras en python  también existen su equivalencia, como por ejemplo de los diccionarios por compresión. Como ejemplo muestro el siguiente código.

#Tenemos un diccionario con temperaturas de provincias y pedidos un valor
#eliminar las provincias cuya temperatura sea igual al valor introducido
#realizarlo mediante un diccionario de compresion
Temp={"Cordoba":20,"Sevilla":19,"Huelva":16,"Jaen":13,"Almeria":16,"Cadiz":13,"Malaga":15}
#introducimos el valor que queremos eliminar
valor=int(input("Introduce el valor a eliminar\n"))
Temp= { k : v for k,v in Temp.items() if v != valor}
print(Temp)

 

Generar PDF de Listas por compresión en Python