2012-06-15 37 views
10

Với danh sách sau đây:Python - Đoàn tự do và tổng hợp một danh sách các hàng

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

Tôi muốn nhóm này bởi, thứ hai, cột thứ tư và thứ năm đầu tiên trong tuple và tổng hợp thứ 3. Ví dụ này tôi sẽ đặt tên cho các cột là col1, col2, col3, col4, col5.

Trong SQL tôi sẽ làm một cái gì đó như thế này:

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

Có một "mát mẻ" cách để làm điều này hoặc là nó tất cả một vòng thủ công?

Trả lời

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

(Chú ý: sản lượng định dạng lại)

+0

Điều này hoạt động tốt hơn - Cảm ơn! – jbassking10

12

Bạn muốn itertools.groupby.

Lưu ý rằng groupby hy vọng đầu vào để được sắp xếp, vì vậy bạn có thể cần phải làm điều đó trước khi tay:

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

'toán tử.itemgetter (0,1,3,4)' – JBernardo

+0

Cảm ơn - hoạt động hoàn hảo! – jbassking10

1

Nếu bạn thấy mình làm điều này rất nhiều với bộ dữ liệu lớn, bạn có thể muốn xem thư viện pandas, trong đó có rất nhiều cơ sở tốt đẹp để thực hiện loại điều này.

Các vấn đề liên quan