問題背景
本周主要寫了各種類型的財務(wù)報表,利用python的csv模塊進行輸出瘫析。
在編寫財務(wù)報表的過程中砌梆,出現(xiàn)了這樣一種需求。
姓名 | 月份 | 電費 | 水費 | 燃氣費 |
---|---|---|---|---|
張三 | 1 | 100.00 | ||
張三 | 1 | 30.00 | ||
張三 | 1 | 40.00 | ||
張三 | 1 | 10.00 | ||
張三 | 2 | 70.00 | ||
李四 | 3 | 66.00 | ||
李四 | 3 | 20.00 |
類似于這樣的報表贬循,要將姓名和月份一致的信息咸包,合并到一條中去。結(jié)果像這樣:
姓名 | 月份 | 電費 | 水費 | 燃氣費 |
---|---|---|---|---|
張三 | 1 | 100.00 | 30.00 | 40.00 |
張三 | 2 | 70.00 | ||
李四 | 3 | 66.00 | 20.00 |
我們使用csv
模塊 的 DictWriter
表1對應(yīng)的數(shù)據(jù)結(jié)構(gòu)為:
[{
'name': '張三',
'month': 1,
'electricity_fee': 100.00,
}, {
'name': '張三',
'month': 1,
'water_fee': 30.00,
}, {
'name': '張三',
'month': 1,
'gas_fee': 40.00,
}, {
'name': '張三',
'month': 1,
'water_fee': 10.00,
}, {
'name': '張三',
'month': 2,
'water_fee': 70.00,
}, {
'name': '李四',
'month': 3,
'electricity_fee': 66.00,
}, {
'name': '李四',
'month': 3,
'gas_fee': 20.00,
}]
表2:
[{
'name': '張三',
'month': 1,
'electricity_fee': 100.00,
'water_fee': 40.00,
'gas_fee': 40.00,
}, {
'name': '張三',
'month': 2,
'water_fee': 70.00,
}, {
'name': '李四',
'month': 3,
'electricity_fee': 66.00,
'gas_fee': 20.00,
}]
如何用簡介優(yōu)雅的代碼將表1的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為表2杖虾?
from itertools import groupby
def get_key(data):
return data['name'] + str(data['month'])
fees = ('electricity_fee', 'water_fee', 'gas_fee')
rows_out = []
for key, group in groupby(rows, key=get_key):
row = group[0]
for fee in fees:
row[fee] = sum(item[fee] for item in group if fee in item)
rows_out.append(row)