Mostrando las entradas con la etiqueta listas por comprensión. Mostrar todas las entradas
Mostrando las entradas con la etiqueta listas por comprensión. Mostrar todas las entradas

miércoles, 23 de octubre de 2013

LISTAS Y DICCIONARIOS POR COMPRENSIÓN EN PYTHON

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.

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:

  • Author
    Posts
  • #86502

    Aashish
    Moderator
    write a program to rotate a M X M matrix by 90 degree.
    Can you do it in-place?
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:

Pythonpasted just now: 
1
2
3
4
5
6
7
8
9
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:
1
[[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():


  1. >>> A = ['pais', 'capital', 'poblacion']
  2. >>> B = ['Brasil', 'Brasilia', '300']
  3. >>> d = {a:b for a,b in zip(A,B)}
  4. >>> print d
  5. {'poblacion': '300', 'pais': 'Brasil', 'capital': 'Brasilia'}