Python – Agrupa por y sum una lista de tuplas

Dada la siguiente lista:

[ ('A', '', Decimal('4.0000000000'), 1330, datetime.datetime(2012, 6, 8, 0, 0)), ('B', '', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 6, 4, 0, 0)), ('AA', 'C', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 5, 31, 0, 0)), ('B', '', Decimal('7.0000000000'), 1330, datetime.datetime(2012, 5, 24, 0, 0)), ('A', '', Decimal('21.0000000000'), 1330, datetime.datetime(2012, 5, 14, 0, 0)) ] 

Me gustaría agruparlos por las columnas primera, segunda, cuarta y quinta de la tupla y sumr la tercera. Para este ejemplo nombraré las columnas como col1, col2, col3, col4, col5.

En SQL haría algo como esto:

 select col1, col2, sum(col3), col4, col5 from my table group by col1, col2, col4, col5 

¿Hay una forma “genial” de hacer esto o es todo un bucle manual?

 >>> [(x[0:2] + (sum(z[2] for z in y),) + x[2:5]) for (x, y) in itertools.groupby(sorted(L, key=operator.itemgetter(0, 1, 3, 4)), key=operator.itemgetter(0, 1, 3, 4))] [ ('A', '', Decimal('21.0000000000'), 1330, datetime.datetime(2012, 5, 14, 0, 0)), ('A', '', Decimal('4.0000000000'), 1330, datetime.datetime(2012, 6, 8, 0, 0)), ('AA', 'C', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 5, 31, 0, 0)), ('B', '', Decimal('7.0000000000'), 1330, datetime.datetime(2012, 5, 24, 0, 0)), ('B', '', Decimal('31.0000000000'), 1330, datetime.datetime(2012, 6, 4, 0, 0)) ] 

(NOTA: salida reformateada)

Usted quiere itertools.groupby .

Tenga en cuenta que groupby espera que la entrada se groupby , por lo que es posible que deba hacerlo de groupby

 keyfunc = lambda t: (t[0], t[1], t[3], t[4]) data.sort(key=keyfunc) for key, rows in itertools.groupby(data, keyfunc): print key, sum(r[2] for r in rows) 

Si se encuentra haciendo esto mucho con grandes conjuntos de datos, es posible que desee ver la biblioteca de pandas , que tiene muchas instalaciones agradables para hacer este tipo de cosas.