2012-06-15 16 views
10

Dada la siguiente lista:Python - Grupo de resumir y una lista de tuplas

[ 
    ('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 agruparlas por la primera, segunda columnas, cuarto y quinto de la tupla y sumar la tercera. Para este ejemplo, nombraré las columnas como col1, col2, col3, col4, col5.

En SQL me gustaría hacer algo como esto:

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

¿Hay una manera "cool" para hacer esto o es todo un bucle manual?

Respuesta

6
>>> [(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: La salida formateada)

+0

Esto funciona aún mejor - ¡Gracias! – jbassking10

12

Quiere itertools.groupby.

Tenga en cuenta que groupby espera la entrada a clasificar, de manera que deberá hacerlo antes de la mano:

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) 
+3

'operator.itemgetter (0,1,3,4)' – JBernardo

+0

Gracias - ¡funciona perfecto! – jbassking10

1

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

Cuestiones relacionadas