






















在 Odoo 或 Py3o 模板中,汇总通常是对某些字段进行累加或汇总统计。你已经提到的通过列表推导式 (list comprehension) 和 sum 来进行汇总是最常见的方式,下面我会介绍如何使用 reduce 和 map 来实现汇总。
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 元素。
============================================================================================================================================================
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() 来对其进行求和。
sum vs reduce vs map:sum:最直观的求和方式,代码简洁。
reduce:适合复杂的累积操作(例如加法、乘法等)。但对于简单求和,sum 更简洁高效。
map:用于对每个元素应用某个函数后再进行处理,常与 filter 结合使用来处理复杂的数据。
使用 sum:
使用 reduce:
使用 map 和 filter:
sum 是最简洁的求和方式。
reduce 适合累积过程,适合复杂计算。
map 和 filter 适用于复杂的转换和过滤,最后可以结合 sum 来进行汇总。
你可以根据数据的复杂性和需求来选择最合适的方法。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。