[Python-es] Tablas "pivot"

Arnau Sanchez pyarnau en gmail.com
Dom Sep 5 14:21:42 CEST 2010


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.


Más información sobre la lista de distribución Python-es