Las listas por comprensión son análogas a los conjuntos por comprensión en teoría de conjuntos. Por ejemplo, A es el conjunto de las vocales (por comprensión) o A = {a,e,i,o,u} (por extensión).
En Python las listas por comprensión se expresan por medio de claúsulas for o if, por ejemplo, la lista A = [0,1,2,3,4] se expresa por comprensión como:
A = [x for x in range(5)]
La primera parte de la lista es una expresión que se va a evaluar de acuerdo a las cláusulas if o for. Por ejemplo para obtener la lista de los números enteros múltiplos de 3 menores que 20:
mult_3 = [x for x in range(1,20) if x%3 == 0]
print mult_3
[3, 6, 9, 12, 15, 18]
Este tipo de listas se pueden usar para resolver el primer problema del proyecto Euler:
Multiples of 3 and 5
Problem 1
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
Find the sum of all the multiples of 3 or 5 below 1000.
Por ejemplo, los números múltiplos de 5 menores que 20:
[x for x in range(1,20) if x%5 == 0]
Out: [5, 10, 15]
Los múltiplos de 3 menores que 20:
[x for x in range(1,20) if x%3 == 0]
Out: [3, 6, 9, 12, 15, 18]
La unión de estas dos listas sería:
[x for x in range(1,20) if x%3 == 0 or x%5==0]
Out: [3, 5, 6, 9, 10, 12, 15, 18]
Si usamos la misma notación para números menores que 1000:
[x for x in range(1,1000) if x%3 == 0 or x%5==0]
Para hallar la suma podemos usar la función sum:
sum([x for x in range(1,1000) if x%3 == 0 or x%5==0])
Out: 233168
Y un ejemplo de la página geeks for geeks:
Una forma de hacerlo para una matriz 3x3 es primero invertir los elementos de la matriz y luego volver a escribir las filas con una lista por comprensión:
Python, pasted just now:
matrix = [[1,2,4],
[0,3,1],
[5,2,7]]
matrix.reverse()
matrix_rotate = [[row[i] for row in matrix]
for i in range(3)]
print matrix_rotate
|
Output:
[[5, 0, 1],
[2, 3, 2],
[7, 1, 4]]
|
Los diccionarios también se pueden definir por comprensión, por ejemplo:
A = {k: k**2 for k in [1,2,3,4,5]} equivale a {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
B= {k: 1 for k in "abcd"} equivale a {'a': 1, 'b': 1, 'c': 1, 'd': 1}
O usando la función zip():
- >>> A = ['pais', 'capital', 'poblacion']
- >>> B = ['Brasil', 'Brasilia', '300']
- >>> d = {a:b for a,b in zip(A,B)}
- >>> print d
- {'poblacion': '300', 'pais': 'Brasil', 'capital': 'Brasilia'}
No hay comentarios.:
Publicar un comentario