2012-06-15 17 views
10

der folgenden Liste zusammenzufassen:Python - Gruppe durch eine Liste von Tupeln

[ 
    ('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)) 
] 

möchte ich gerne Gruppe diese von den ersten, zweiten, vierten und fünften Spalte in dem Tupel und die 3. summieren. In diesem Beispiel benenne ich die Spalten als col1, col2, col3, col4, col5.

In SQL würde ich so etwas tun:

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

Gibt es einen „cool“ Weg, dies zu tun, oder ist es eine ganze manuelle Schleife?

Antwort

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)) 
] 

(HINWEIS: Ausgabe umformatiert)

+0

Das funktioniert noch besser - Danke! – jbassking10

12

Sie möchten itertools.groupby.

Beachten Sie, dass groupby die Eingabe erwartet sortiert werden, so dass Sie tun müssen, um die vor der Hand:

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

Danke - funktioniert perfekt! – jbassking10

1

Wenn Sie sich dies zu tun finden Wenn Sie viel mit großen Datasets arbeiten, sollten Sie sich die Bibliothek pandas ansehen, die viele nützliche Funktionen für diese Art von Aufgaben bietet.

Verwandte Themen