Re: [Python-es] Tablas pivot
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
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
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
-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
-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/