py3o中汇总的计算:sum reduce map 三种形式来处理对比
在 Odoo 或 Py3o 模板中,汇总通常是对某些字段进行累加或汇总统计。你已经提到的通过列表推导式 (list comprehension) 和 sum 来进行汇总是最常见的方式,下面我会介绍如何使用 reduce 和 map 来实现汇总。
1. 使用 reduce 来汇总:
reduce 函数来自 Python 的 functools 模块,它会将列表中的元素通过一个累加函数累积起来。以下是通过 reduce 来实现汇总的示例。
首先,确保你有正确的导入:
${eval("__import__('functools').reduce(lambda x, y: x + y, [lyt.package_qty for lyt in objects.order_line if lyt.client_order_ref == order_ref])")}
解释:
-
reduce(lambda x, y: x + y, ...):这个表达式将x和y累加。reduce会将列表中的每个元素依次和前一个元素累加,最终返回总和。 -
[lyt.package_qty for lyt in objects.order_line if lyt.client_order_ref == order_ref]:列表推导式生成了需要汇总的所有package_qty元素。
============================================================================================================================================================
2. 使用 map 来汇总:
map 函数用于对列表中的每个元素应用一个函数,然后返回一个新的列表。你可以先使用 map 转换数据(例如将数据转化为数字),然后使用 sum 来汇总。
${sum(map(lambda lyt: lyt.package_qty, filter(lambda lyt: lyt.client_order_ref == order_ref, objects.order_line)))}
解释:
-
map(lambda lyt: lyt.package_qty, ...):这个表达式对order_line列表中的每个元素应用lambda函数,提取package_qty字段。 -
filter(lambda lyt: lyt.client_order_ref == order_ref, objects.order_line):filter用来过滤出满足条件的订单行(根据client_order_ref字段过滤)。
map 会生成一个新的列表,其中每个元素都是 package_qty 字段的值。然后你可以用 sum() 来对其进行求和。
3. 对比:sum vs reduce vs map:
-
sum:最直观的求和方式,代码简洁。 -
reduce:适合复杂的累积操作(例如加法、乘法等)。但对于简单求和,sum更简洁高效。 -
map:用于对每个元素应用某个函数后再进行处理,常与filter结合使用来处理复杂的数据。
示例汇总:
-
使用
sum:
-
使用
reduce:
-
使用
map和filter:
总结:
-
sum是最简洁的求和方式。 -
reduce适合累积过程,适合复杂计算。 -
map和filter适用于复杂的转换和过滤,最后可以结合sum来进行汇总。
你可以根据数据的复杂性和需求来选择最合适的方法。

浙公网安备 33010602011771号