它有一种内置(或天真的)方式来处理(求和、计数)由 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)
IE
In LAX purchased 60 fruit at the total price of $143.82
In NYC purchased 14 fruit at the total price of $29.88
附言。我注意到有很多类似的问题......但没有一个只是简单地采用(类似)一个天真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))