如何在Jinja中统计字典列表中值“P”的出现次数并添加total字段
解决Jinja2中字典列表统计值出现次数并添加total键的问题
需求说明
有一个字典列表,需要统计每个字典中值为"P"的出现次数,为每个字典添加"total"键,并将统计结果作为该键的值。示例列表如下:
{% set my_list = [ {'key1': "P",'key2': "P",'key3': "P",'key4': "P"}, {'key1': "",'key2': "P",'key3': "P",'key4': "P"}, {'key1': "P",'key2': "P",'key3': "",'key4': "P"} ] %}
原代码问题
你编写的代码无法正确累加count,每次返回的都是0,代码如下:
{% for my_dict in my_list %} {% set count = 0 %} {% for key, value in my_dict.items() %} {% if value == 'P' %} {% set count = count + 1 %} {% endif %} {% endfor %} {% set _ = emp.update({'total': count}) %} {% endfor %}
问题出在两个地方:
- Jinja2变量作用域限制:普通的
set变量是块级作用域,内层循环中修改count时,实际是创建了一个新的局部变量,不会影响外层的count值,所以外层的count始终是初始的0。 - 变量名错误:代码中使用
emp.update,但实际应该操作循环中的my_dict。
正确解决方案
方法一:使用Namespace维护可变变量
Jinja2的namespace对象的属性是可变的,可以用来在嵌套循环中维护累加值:
{% set my_list = [ {'key1': "P",'key2': "P",'key3': "P",'key4': "P"}, {'key1': "",'key2': "P",'key3': "P",'key4': "P"}, {'key1': "P",'key2': "P",'key3': "",'key4': "P"} ] %} {% for my_dict in my_list %} {% set ns = namespace(count=0) %} {% for key, value in my_dict.items() %} {% if value == 'P' %} {% set ns.count = ns.count + 1 %} {% endif %} {% endfor %} {% set _ = my_dict.update({'total': ns.count}) %} {% endfor %} {# 输出结果 #} {{ my_list }}
方法二:使用过滤器简化统计
利用Jinja2的过滤器组合,直接统计值为"P"的元素数量,代码更简洁:
{% set my_list = [ {'key1': "P",'key2': "P",'key3': "P",'key4': "P"}, {'key1': "",'key2': "P",'key3': "P",'key4': "P"}, {'key1': "P",'key2': "P",'key3': "",'key4': "P"} ] %} {% for my_dict in my_list %} {% set p_count = my_dict.values() | selectequalto('P') | list | length %} {% set _ = my_dict.update({'total': p_count}) %} {% endfor %} {# 输出结果 #} {{ my_list }}
两种方法最终都会得到你期望的输出:
[ {'key1': 'P', 'key2': 'P', 'key3': 'P', 'key4': 'P', 'total': 4}, {'key1': '', 'key2': 'P', 'key3': 'P', 'key4': 'P', 'total': 3}, {'key1': 'P', 'key2': 'P', 'key3': '', 'key4': 'P', 'total': 3} ]
内容的提问来源于stack exchange,提问作者Sagar Patil
相关产品推荐
相关产品推荐

