Python:用lambda/reduce找最大值,优化二维列表元组代码输出
问题1:能否用lambda/reduce函数查找元素中的最大值?
完全可以。reduce的核心是迭代合并序列元素,配合lambda表达式就能实现全局最大值的查找。比如针对包含(编号, 总价)的列表,用以下方式就能选出总价最大的项:
from functools import reduce items = [('9744', 809.1), ('88112', 549.78), ('88112', 399.5)] max_item = reduce(lambda a, b: a if a[1] > b[1] else b, items)
这里lambda表达式负责两两比较元素的总价(第二个值),reduce会迭代完成全局最大值的筛选。
问题2:基于现有代码获取全局最大值对应的结果
首先修正你现有代码里的笔误:a[1]+a[1]是多余的,前面的map(lambda y: (y[0], y[1]*y[2]), x[1:])已经算出了y*z的总价,直接保留a即可。修正后的单列表最大值提取逻辑更简洁:
map(lambda x: max(map(lambda y: (y[0], y[1]*y[2]), x[1:])), orders)
接下来要从子列表最大值的集合里找全局最大项,不需要额外if语句,直接用max()函数指定key为元素的第二个值(总价)即可,把现有代码作为max()的输入:
# 完整代码,尽量少改动原有逻辑 result = max( map(lambda x: max(map(lambda y: (y[0], y[1]*y[2]), x[1:])), orders), key=lambda item: item[1] ) print(list(result)) # 输出: ['9744', 809.1]
如果一定要用reduce替代max,也可以这样实现:
from functools import reduce result = reduce( lambda a, b: a if a[1] > b[1] else b, map(lambda x: max(map(lambda y: (y[0], y[1]*y[2]), x[1:])), orders) ) print(list(result))
两种方式都能高效得到目标结果,全程无需if语句,仅在现有代码外层套一层全局最大值筛选逻辑即可。
内容的提问来源于stack exchange,提问作者EggCoder
相关产品推荐
相关产品推荐

