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.

domingo, 15 de septiembre de 2013

CODECADEMY-PYTHON

Luego de tres meses terminé el curso de Python en Codecademy. Espero también terminar el curso de Python en Udacity (Introduction to Computer Science).



martes, 10 de septiembre de 2013

PROJECT EULER PROBLEMA 8

En el problema 8 hay que encontrar el mayor producto de cinco cifras consecutivas en un número de 100 cifras.

Find the greatest product of five consecutive digits in the 1000-digit number.
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

La solución en Python con una sola línea de código: 

max([int(numero[x])*int(numero[x+1])*int(numero[x+2])*int(numero[x+3])*int(numero[x+4]) for x in range(len(numero)-4)])

Salida:  40824

domingo, 8 de septiembre de 2013

PROJECT EULER PROBLEMA 6

Problema 6 y su solución con Python:

The sum of the squares of the first ten natural numbers is,
12 + 22 + ... + 102 = 385
The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)2 = 552 = 3025
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

diferencia = sum(range(1,101))**2 - sum([x**2 for x in range(1,101)])

viernes, 6 de septiembre de 2013

Project Euler

El proyecto Euler es un sitio donde se pueden encontrar ejercicios matemáticos que se pueden resolver con algún lenguaje de programación. Hasta ahora hay 434 problemas planteados y divididos en niveles de 25 ejercicios cada uno.

El cuarto ejercicio pide hallar el mayor número palíndromo, es decir, que se puede leer igualmente de izquierda a derecha y de derecha a izquierda (como 90109) y que sea producto de la multiplicación de dos números de tres cifras.




Usando listas por comprensión y la función max en Python se puede resolver con una sola línea de código:

max([x*y for x in range(900,999) for y in range(900,999) if str(x*y)==str(x*y)[::-1]])

Salida: 906609

martes, 27 de agosto de 2013

El siguiente programa filtra los datos importantes en un documento xml y los imprime de forma organizada:

http://codepad.org/z9D2wFv0

arch = """<listitem>
    <variable name="UUID">2bd9c142-9e91-4182-b85c-5bb616823bd9</variable>
    <variable name="Name">kurokysan</variable>
    <variable name="AccStatus">1</variable>
    <variable name="WWWFilter">JARSP</variable>
    <variable name="UseTemplate">1</variable>
    <variable name="Rights">0</variable>
    <variable name="AdmFilter">JARSP</variable>
    <variable name="QuotaDayEnabled">0</variable>
    <variable name="QuotaDayType"></variable>
    <variable name="QuotaDay">5242880</variable>
    <variable name="QuotaWeekEnabled">0</variable>
    <variable name="QuotaWeekType"></variable>
    <variable name="QuotaWeek">0</variable>
    <variable name="QuotaMonthEnabled">0</variable>
    <variable name="QuotaMonthType"></variable>
    <variable name="QuotaMonth">0</variable>
    <variable name="QuotaAction"></variable>
    <variable name="QuotaSendAlert">0</variable>
    <variable name="Lang">detect</variable>
    <variable name="DontUseLangTemp">0</variable>
    <variable name="DetectedLang"></variable>
  </listitem>"""


indice = 0
indice2 = 0
while indice < len(arch):
    init = arch.find('"',indice)
    final = arch.find('"',init + 1)
    init2 = arch.find('">',indice2)
    final2 = arch.find('<',init2+1)
    if init == -1:
        break
    indice = final + 1
    indice2 = final + 1
    if len(arch[init2+2:final2]) == 0:
        print arch[init+1:final] + ' = ' + str(None)
    else:
        print arch[init+1:final] + ' = ' + str(arch[init2+2:final2])


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
UUID = 2bd9c142-9e91-4182-b85c-5bb616823bd9
Name = kurokysan
AccStatus = 1
WWWFilter = JARSP
UseTemplate = 1
Rights = 0
AdmFilter = JARSP
QuotaDayEnabled = 0
QuotaDayType = None
QuotaDay = 5242880
QuotaWeekEnabled = 0
QuotaWeekType = None
QuotaWeek = 0
QuotaMonthEnabled = 0
QuotaMonthType = None
QuotaMonth = 0
QuotaAction = None
QuotaSendAlert = 0
Lang = detect
DontUseLangTemp = 0
DetectedLang = None

lunes, 19 de agosto de 2013

RECURSOS EN GOOGLE DEVELOPERS


En Google developers se puede encontrar tutoriales y videos para aprender Python. Hay una sección con ejercicios de práctica para revisar el tema dado.




Uno de los problemas propuestos es encontrar y organizar por orden alfabético los nombres más populares de niños nacidos en determinado año. Al lado de cada nombre debe aparecer el puesto en términos de popularidad. 




He aquí cómo resolví el ejercicio en Python. Aunque no se ve muy elegante sí muestra los resultados esperados.





domingo, 21 de julio de 2013

El Tutor en Línea Python

El tutor (Online Python Tutor) permite visualizar paso a paso la ejecución de un programa para así poder hacer las correcciones sobretodo en el caso de ser un principiante en programación. En la parte superior del visualizador se puede ver una flecha roja que recorre el código y al lado se ve cómo cambian las variables. Y si el prgrama tiene alguna salida, ésta aparece en la parte inferior. Veamos como luce la página:




Otra fuente para aprender Python que se recomienda mucho es el libro "How to think like a computer scientist". El autor es Allen Downey y se puede descargar gratuitamente. Aquí una muestra del contenido del libro:



Y finalmente el curso de MITOPENCOURSEWARE, introducción a la ingeniería eléctrica y la informática ofrece una excelente introducción al lenguaje Python:


jueves, 4 de julio de 2013

Estudiar algoritmos

Aunque mi principal intención es programar con el lenguaje Python, creo que es importante tener ciertos conocimientos teóricos que den una mejor visión de esta actividad. Encontré dos buenas fuentes de información acerca del estudio de algoritmos. Pero primero veamos lo que dice Wikipedia acerca de los algoritmos:


"En matemáticaslógicaciencias de la computación y disciplinas relacionadas, un algoritmo (del griego y latín, dixit algorithmus y este a su vez del matemático persa Al-Juarismi ) es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia."


Coursera ofrece un curso llamado "Algorithms: design and analysis" de la Universidad de Standford. Entre los temas que enseña están: análisis asintótico, estudio de grafos, árboles binarios, algoritmo de Dijkstra. La Universidad de Princeton tiene el curso "Algoritms, Part I" con el profesor Robert Sedgewick. Algo similar se encuentra en la página Teaching Tree donde además se ofrecen cursos de informática y desarrollo Web.



Curso de algoritmos en Coursera:





Algoritmos en la Universidad de Princeton:






Recursos en Teaching Tree:



lunes, 1 de julio de 2013

Comienzo con Python

A mitad de junio de 2013 decidí que definitivamente debía aprender a programar en serio. Escogí el lenguage de programación Python porque había comenzado a conocerlo a través de Udacity con el curso "Intro to computer science" dictado por David Evans. Luego me inscribí en el curso "A Taste of Python Programming" en la plataforma edX. Un curso para principiantes con el profesor  John Guttag. Igualmente sigo las lecciones de Codecademy que he completado en un 60%. Estoy aprovechando las vacaciones y  dedico varias horas al día a aprender y programar. 

Así luce la página de Udacity:

Este es un pantallazo de la página de edX:




Y Finalmente Codecademy: