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'}

No hay comentarios.:

Publicar un comentario