2012-06-15 15 views
10

のリストを合計:パイソン - グループによって、以下のリストを与えられたタプル

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

私は、タプルの第1、第2、第4列と第5列でグループこれらはしたいと3を合計します。 この例では、列の名前をcol1、col2、col3、col4、col5とします。

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

これを行うには「クール」な方法がありますか、それはすべての手動ループです:SQLで

私はこのような何かをしますか?

答えて

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

(注:出力は再フォーマット)

+0

これはさらにうまくいく - ありがとう! – jbassking10

12

希望するitertools.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) 
+3

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

+0

ありがとうございます - 完璧な作品! – jbassking10

1

あなた自身がこれをやって見つけた場合、あなたが手の前にそれを行う必要があるかもしれませんのでgroupbyは、入力がソートされることを想定していること

注意大きなデータセットがたくさんある場合は、pandasライブラリを見てみてください。このライブラリには、このようなことを行うための素晴らしい機能がたくさんあります。

関連する問題