reduce与map+filter的复杂计算场景
好的,接下来我将给你举几个常见的应用场景,说明如何使用 reduce、map 和 filter 来处理复杂的计算逻辑。这些场景涵盖了日常开发中可能遇到的任务。
1. 使用 reduce 进行复杂的累积计算
示例场景:商品订单总价的计算(带折扣)
假设你有一个订单列表,每个订单行包含商品的价格、数量、折扣等。你需要计算订单总价,并在每个订单行上应用折扣。
订单数据:
order_lines = [
{'product': 'A', 'price': 100, 'quantity': 2, 'discount': 0.1}, # 10% 折扣
{'product': 'B', 'price': 200, 'quantity': 1, 'discount': 0.05}, # 5% 折扣
{'product': 'C', 'price': 150, 'quantity': 3, 'discount': 0.2} # 20% 折扣
]
计算逻辑:
-
对于每个订单行,计算实际的总价:
实际总价 = 价格 * 数量 * (1 - 折扣) -
使用
reduce来累积所有订单的总价。
代码实现:
from functools import reduce
# 计算每个订单行的总价并进行累积
total_price = reduce(
lambda acc, line: acc + (line['price'] * line['quantity'] * (1 - line['discount'])),
order_lines, 0 # 初始值为 0
)
print(f"订单总价:{total_price}")
解释:
-
reduce函数接受一个累积器(acc),它会将每个订单行的总价累加。 -
通过
line['price'] * line['quantity'] * (1 - line['discount'])计算每个订单行的折后价格。 -
最终通过
reduce汇总所有订单行的折后价格,得到订单的总价。
计算结果:
订单总价:765.0
2. 使用 map 和 filter 进行复杂的转换和过滤
示例场景:筛选并计算符合条件的商品总价
假设你有一个商品列表,每个商品包含 类型、价格、库存 等信息。你需要:
-
筛选出库存大于 10 的商品。
-
对这些商品应用 10% 的折扣。
-
计算这些商品的总价格。
商品数据:
products = [
{'product': 'A', 'price': 100, 'stock': 5, 'category': 'electronics'},
{'product': 'B', 'price': 200, 'stock': 20, 'category': 'clothing'},
{'product': 'C', 'price': 150, 'stock': 15, 'category': 'electronics'},
{'product': 'D', 'price': 300, 'stock': 8, 'category': 'clothing'},
{'product': 'E', 'price': 250, 'stock': 30, 'category': 'electronics'}
]
计算逻辑:
-
筛选库存大于 10 的商品:使用
filter过滤出库存大于 10 的商品。 -
应用折扣:使用
map对每个商品应用 10% 的折扣。 -
计算总价:最后通过
sum计算所有符合条件商品的总价。
代码实现:
# 筛选库存大于10的商品
filtered_products = filter(lambda p: p['stock'] > 10, products)
# 对这些商品应用10%折扣
discounted_products = map(lambda p: p['price'] * 0.9, filtered_products)
# 计算总价格
total_price = sum(discounted_products)
print(f"符合条件商品的折后总价:{total_price}")
解释:
-
filter(lambda p: p['stock'] > 10, products):这一步筛选出库存大于 10 的商品。 -
map(lambda p: p['price'] * 0.9, filtered_products):这一步对筛选出的商品应用 10% 的折扣(即价格的 90%)。 -
sum(discounted_products):最终计算折扣后的总价。
计算结果:
符合条件商品的折后总价:1050.0
总结:
-
reduce:适合进行复杂的累积计算,比如折扣后价格的累加,或者需要多个中间计算步骤的聚合。 -
map:适合对每个元素进行简单的转换或处理(如应用折扣)。 -
filter:适合用来筛选符合条件的元素,比如库存大于某个数值的商品。
这些工具各有其优势,通常可以结合使用。map 和 filter 用来做数据转换和筛选,reduce 用来做数据累积和复杂的计算任务。

浙公网安备 33010602011771号