itertools.groupby によって生成された集計を処理 (合計、カウント) する組み込みの (または単純な) 方法はありますか?
たとえば、10% の割引があるコード例のテーブルを考えると...
したい:
# Select each city...
for city,city_purchases_d in itertools.groupby(transaction_l,
lambda d: d["city"]):
print Aggregate( city,sum(|qty|),sum(|qty * price|)*(1-discount) ) *
city_purchases_d
入力データ:
discount=0.10 # 10%
transaction_l=(
dict(trans=201, name="Anne", city="LAX", item="Apple", qty=10, price=1.33),
dict(trans=202, name="Betty", city="LAX", item="Banana",qty=20, price=2.33),
dict(trans=203, name="Carol", city="LAX", item="Cherry",qty=30, price=3.33),
dict(trans=101, name="Andy", city="NYC", item="Avodado",qty=1, price=1.32),
dict(trans=102, name="Andy", city="NYC", item=u"Açaí", qty=1, price=1.70),
dict(trans=103, name="Bob", city="NYC", item="Bacuri", qty=3, price=2.10),
dict(trans=104, name="Cliff", city="NYC", item="Carrot", qty=4, price=2.22),
dict(trans=105, name="David", city="NYC", item="Donut", qty=5, price=3.00)
)
出力は次のようになります。
('LAX',60,143.82)
('NYC',14,29.88)
すなわち
In LAX purchased 60 fruit at the total price of $143.82
In NYC purchased 14 fruit at the total price of $29.88
ps。これに似た質問がたくさんあることに気付きました...しかし、単純に(のような)city,sum(|qty|),sum(|qty * price|)*(1-discount)
集計のための単純な式を取るものはありません。
編集:(ジェネレータ内包表記を使用することを犠牲にして)次のように効果をほぼ達成できます:
discount=0.10 # 10%
desc_f="In %s purchased %s fruit at the total price of $%.2f"
for city,city_purchases_d in itertools.groupby(transaction_l, lambda d: d["city"]):
# alternatively - Plan B: manually creating aggregation DOES also work:
qty_x_price=list(trans["qty"]*trans["price"] for trans in list(city_purchases_d))
qty=(trans["qty"] for trans in city_purchases_d)
print desc_f%(city,sum(qty),sum(qty_x_price)*(1-discount))