如何在Jinja模板的for循环中累加浮点数组的值?
Jinja2模板循环中累加数值的问题
我是Python新手,本以为在Jinja2模板的for循环中累加数值是件简单的事,但凭借现有基础知识无法实现,希望能得到帮助。
我在Python中定义了一个浮点数组:
floatArray = [1.5,3.6,5.8,9.8,10,5.0]
并将其传入模板:
render_template("array.html", floatArray=floatArray,)
我在模板中尝试累加这些值:
{% set total = 0.0 %} {% for x in floatArray %} {% set total = x + total %} {{ x }} - {{ total }}<br> {% endfor %} <br>{{ total }}
得到的结果是:
1.5 - 1.5 3.6 - 3.6 5.8 - 5.8 9.8 - 9.8 10 - 10.0 5.0 - 5.0 0.0
我期望第二列的值能逐步累加:1.5、5.1、10.9……最终得到总和35.7,但total值在每次循环后都会重置。我想知道如何避免这种情况?
我知道可以使用:
{{ float_array|sum() }}
但这无法满足需求,因为我的代码中有多个for循环,需要对循环的部分内容进行求和。请指点正确的解决方向。
问题原因
Jinja2中用{% set %}定义的变量是块级作用域,每次循环迭代都会创建一个新的total变量,而不是修改外层的那个。循环结束后,外层的total还是初始的0.0。
解决方法
方法1:使用namespace对象(官方推荐)
Jinja2提供了namespace对象来创建跨作用域的变量,其属性可以在循环中直接修改,不会被作用域限制:
{% set ns = namespace(total=0.0) %} {% for x in floatArray %} {% set ns.total = ns.total + x %} {{ x }} - {{ ns.total }}<br> {% endfor %} <br>{{ ns.total }}
方法2:用可变对象存储累加值
利用Jinja2允许修改可变对象内部属性的特性,用列表或字典来承载累加值:
{% set total = [0.0] %} {% for x in floatArray %} {% set _ = total.append(total.pop() + x) %} {{ x }} - {{ total[0] }}<br> {% endfor %} <br>{{ total[0] }}
这里用{% set _ = ... %}是因为Jinja2不允许单独的表达式语句,用下划线接收返回值来规避语法限制。
方法3:自定义过滤器(适合复用场景)
如果需要在多个循环中使用累加逻辑,建议在Python代码中自定义过滤器,提前计算好累加序列:
@app.template_filter('cumulative_sum') def cumulative_sum(arr): total = 0.0 cumulative = [] for num in arr: total += num cumulative.append(total) return cumulative
然后在模板中调用:
{% set cumulative_totals = floatArray|cumulative_sum %} {% for x, total in zip(floatArray, cumulative_totals) %} {{ x }} - {{ total }}<br> {% endfor %} <br>{{ cumulative_totals[-1] }}
内容的提问来源于stack exchange,提问作者Rexomnium
相关产品推荐
相关产品推荐

