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號