Re: [Python-es] Tablas pivot

2010-09-05 Por tema Arnau Sanchez
On Sat, 4 Sep 2010 16:07:55 -0500 Carlos Herrera Polo wrote:

 algo que en mis tiempos de programador era imposible... y sera porque
 tengo ya nociones arraigadas en otros lenguajes no entiendo mucho ciertos
 conceptos de Python...

Bueno, todo depende de qué lenguajes provengas. Por nombrar uno fundamental:
(en lo fundamental) no hay código en Python que no tenga equivalente en Lisp...
y éste se creó en 1958!

 quisiera utilizarlo, y quisiera consultarles, antes de hacer el clasico
 programa lleno de blucles y matrices (no se como usar matrices en Python...

Que la vista tenga pinta de matriz no significa que la estructura de datos
también deba serlo. En este caso parece que una lista de tuplas (fila,
columnas) es más conveniente. Dicho al estilo Haskell: [(cosa, [numero])]

 listas o tuplas, he visto que hacen muchas cosas con listas, que no
 comprendo , pero reducen muchas lineas de codigo...

¿Te refieres a cosas como comprensiones de listas/generatores, usar
funciones como parámetros, el módulo itertools, etc? si es eso, lo que
buscas son conceptos de programación funcional. Hace poco pegué unos enlaces
en la lista, los repito:

http://en.wikipedia.org/wiki/Functional_programming
http://www.amk.ca/python/writing/functional

En este caso, y sin meternos en formatear la tabla (que es engorroso), algo así
podría servir (asumo columnas name y num en una tabla things):

import itertools, operator
connection = ...
sql = SELECT name, num FROM things ORDER BY name;
groups = itertools.groupby(connection.execute(sql), operator.itemgetter(0))
table = ((name, map(operator.itemgetter(1), grp)) for (name, grp) in groups)
for name, nums in table: 
print row, name, has nums, nums

Seguramente el agrupamiento se podría hacer ya en SQL (¿con el agregador
group_concat?), pero en fin, no pasa nada si se hace en Python.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


[Python-es] Variable global

2010-09-05 Por tema Narcis Garcia - GiLUG
Hola, uso una variable global para almacenar la configuración de mi 
programa, la cual relleno mediante una función así:


def CargarConfiguracion(Configuracion):
Configuracion[FicheroConf] = /etc/miprograma.conf
...

Que luego necesito usar dentro de una clase así:

class InterfazPrincipal(wx.Frame):
global Configuracion
...

Y en el núcleo del programa procedo así:

LaAplicacion = wx.App(False)
CargarConfiguracion(Configuracion)
InterfazPrincipal(None, titulo)
LaAplicacion.MainLoop()

El problema es que dentro de la clase no parece que se entere de los 
valores de la variable global, porque al intentarla usar me dice:

KeyError: 'FicheroConf'
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Variable global

2010-09-05 Por tema Sergio Soto Núñez
Debes definirla, aunque sea una cadena vacía, fuera de toda función, yo
suelo hacerlo debajo de los import
__
If it WalksLikeaDuck and talks like a duck, it must be a duck. David Thomas


2010/9/5 Narcis Garcia - GiLUG informat...@actiu.net

 Hola, uso una variable global para almacenar la configuración de mi
 programa, la cual relleno mediante una función así:

 def CargarConfiguracion(Configuracion):
Configuracion[FicheroConf] = /etc/miprograma.conf
...

 Que luego necesito usar dentro de una clase así:

 class InterfazPrincipal(wx.Frame):
global Configuracion
...

 Y en el núcleo del programa procedo así:

 LaAplicacion = wx.App(False)
 CargarConfiguracion(Configuracion)
 InterfazPrincipal(None, titulo)
 LaAplicacion.MainLoop()

 El problema es que dentro de la clase no parece que se entere de los
 valores de la variable global, porque al intentarla usar me dice:
 KeyError: 'FicheroConf'
 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Variable global

2010-09-05 Por tema Chema Cortes
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

El 05/09/10 14:59, Narcis Garcia - GiLUG escribió:
 Hola, uso una variable global para almacenar la configuración de mi
 programa, la cual relleno mediante una función así:

Yo intentaría evitar usar variables globales en todo momento. El código
queda poco claro y difícil de mantener. Es mejor colocar toda
configuración en un módulo aparte e importarlo allí donde te haga falta.
Así sabrás de dónde vienen las variables y, sobre todo, asociar a cada
cosa su propio espacio de nombres para que no se pisen entre sí.

Respondiendo a tu pregunta concreta, la declaración explícita de una
variable como global sólo tiene un cometido: su modificación. Si sólo
vas a leer su valor, entonces es global implícitamente.


 def CargarConfiguracion(Configuracion):
 Configuracion[FicheroConf] = /etc/miprograma.conf
 ...

Aquí Configuración (la variable global?) la estás pasando como
argumento, o sea, es local dentro de la función.


 Que luego necesito usar dentro de una clase así:
 
 class InterfazPrincipal(wx.Frame):
 global Configuracion
 ...

Como te decía, si la clase no modifica la variable global, entonces esta
declaración de global es puramente decorativa (no está mal, pero sin
ella funciona todo igual).


 Y en el núcleo del programa procedo así:
 
 LaAplicacion = wx.App(False)
 CargarConfiguracion(Configuracion)
 InterfazPrincipal(None, titulo)
 LaAplicacion.MainLoop()
 
 El problema es que dentro de la clase no parece que se entere de los
 valores de la variable global, porque al intentarla usar me dice:
 KeyError: 'FicheroConf'

Si es verdad que éste es el núcleo, entonces no entiendo el porqué del
error. Habría que ver más código y ver dónde se crea la variable global.

De todos modos, si usas algún debugger de python te será fácil ir
siguiendo las modificaciones de las variables globales y comprobar qué
está pasando.

-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJMhCKIAAoJEFdWyBWwhL4FQ4YH/RVT/IHSSK459DuLEdAhEaZJ
ij8sJ/G8HSEoTn4YMkjav5avLc9rpUcR+UhgCRC5bPHKRJc8JXQD4zBcF4TmOq3+
K+frSX2GfoFvDKnIE8Bl3ENIKFBjOqEecRMgS2pIo2WjWNacvhRL9ZlW3wVW2BV1
gZaX2yU9AThaLv0oqNnefL+phEIHRCgxfvFTH9ixkkZerCYVDWBDJNiP7NhxHzcU
1Ex39I0zL5qDwg2bwlZ0zCq15difAzC11v54QNDkkwc+GhywNcgHN+4gjCwICVhq
RY+rCD/Jkw+KAIsn+VjKJncOM10ZAS6SlT1laCbo61g7z+KB6CVPRsWx4MFcAIo=
=kXEs
-END PGP SIGNATURE-
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Tablas pivot

2010-09-05 Por tema Chema Cortes
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

El 04/09/10 23:07, Carlos Herrera Polo escribió:

 Bueno, el motivo puntual que escribo este correo se debe a lo siguiente,
 quiero hacer un pequeño programa que lea una base de datos MySQL, la
 cual retorna segun el select que ya construi los siguientes valores de
 ejemplo (solo son 2 columnas):
 
 1 - Arbol
 1 -Manzana
 1- Pera
 2 - Arbol
 2 - Manzana
 3 - Manzana
 3 - Pera
 3 - Platano
 3 - Uva
 4 - Pera
 5 - Arbol
 5 - Pera
 
 Esto entiendo (por lo poco que entendi), lo regresa en una lista, he
 utilizado las librerias mas comunes para conectarme a MySQL desde
 Python, el SQL ya funciona y me retorna esos valores de ejemplo. Lo que
 quisiera hacer es convertir esto a tablas crosstab o pivot, como por
 ejemplo:
 
 
* 12  3  
   4   5*
 Arbol X   X
  X
 Manzana   XX X  
 Pera X   X
  XX
 Platano X
 UvaX


Arnau te ha puesto una solución con iteradores. Cuesta entenderlos al
principio, pero una vez que has pillado el concepto no querrás dejar de
usarlos. Su eficiencia en recursos utilizados han conseguido que casi
todo en python se esté orientando a trabajar con estas estructuras.

La documentación que ha puesto Arnau la tienes algo más actualizada en
los howtos de python.org:

  http://docs.python.org/howto/functional.html

También hay un howto sobre ordenaciones que te será muy útil:

  http://docs.python.org/howto/sorting.html


De todos modos, si prefieres algo menos intimidante, aquí te pongo una
solución empleando diccionarios:

pivot={}

for num,nombre in resultados:
   pivot.setdefault(nombre,[]).append(num)

-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJMhDe7AAoJEFdWyBWwhL4FswAIAKOLHHx+kk+tVlAMcShSmSnU
k5xZPew6evKADcA/deKxbEOchFU01bcE9XhQmTZ3oThW7t/ZVhF2CGexJMO/H75D
0lE/nqzHBWCCAE1PDavE2sHu7k/PZtFPg4951B8XLNqdwCAX4gEmbraDSDmr6wi3
EGmtRyXf51T0RBrleL4VOdwon5TX8bnGHHlKraTNVjSC9XhMfFdKBxInWookPFRn
N1UNhikTLGz7tKEFvcJaedin2Rk3ZYGxqZIom9X1mQmosFYcpJN4mZinW+4T+YIr
jOcVA4agX+Mo6SJEon6FJ1iHBvMCgERyoklbwvZwOXhr8FfN4NRYtf7pJsjZ1VM=
=bM9D
-END PGP SIGNATURE-
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/