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

domingo, 20 de octubre de 2013

Coursera: programación interactiva con Python

El 7 de octubre comenzó el curso a través de la plataforma Coursera acerca de juegos interactivos con Python. Los instructores son Joe Warren, Scott Rixner, John Greiner y Stephen Wong de la Universidad Rice en Houston. El objetivo final del curso es crear un juego llamado RiceRocks usando una interfaz gráfica.



El curso tiene su propio intérprete Python en línea llamado CodeSkulptur:



CodeSkulptur tiene una excelente documentación de las funciones de Python:

Syntax:
a_dict.get(key)
a_dict[key]
Example:
CodeOutput
d = {1: 'a', 2: 'b', 3: 'c'}
print d.get(2)
print d[2]
'b'
'b'
Returns the value associated with the given key the dictionary a_dict. If the key is not in the dictionary, then a_dict.get(key) returns None, while a_dict[key] raises a KeyError error.