使用 groupby 过滤器后应用神社过滤器
Applying a jinja filter after using groupby filter
我有一个字典列表,我想按某个属性分组,然后按另一个属性求和。对于变量 'foo' 这将是这样的:
foo | groupby('a') | sum(attribute='b')
这显然行不通,因为在 groupby
之后,我有一个元组列表。有什么方法可以解压元组然后重新打包,这样我就可以维护 groupby
完成的工作,但处理第二个元组值?
您可以使用 map()
filter 对每个组应用总和,前提是您先提取组列表:
foo | groupby('a') | map(attribute='list') | map('sum', attribute='b')
这是因为 map()
将第一个参数作为另一个过滤器,其余参数将传递给该过滤器,将该过滤器应用于 groupby()
的每个元素。
这确实意味着您最终得到的是总和列表,而不是组。
您不能将求和应用于组并保留 .grouper
属性。为此,唯一的解决方案是使用实际循环:
{% for group in foo | groupby('a') %}
{{ group.grouper }}: {{ group.list | sum(attribute='b') }}
{% endfor %}
将输出 a
的每个不同值,后跟冒号和该组的属性 b
的总和。
我有一个字典列表,我想按某个属性分组,然后按另一个属性求和。对于变量 'foo' 这将是这样的:
foo | groupby('a') | sum(attribute='b')
这显然行不通,因为在 groupby
之后,我有一个元组列表。有什么方法可以解压元组然后重新打包,这样我就可以维护 groupby
完成的工作,但处理第二个元组值?
您可以使用 map()
filter 对每个组应用总和,前提是您先提取组列表:
foo | groupby('a') | map(attribute='list') | map('sum', attribute='b')
这是因为 map()
将第一个参数作为另一个过滤器,其余参数将传递给该过滤器,将该过滤器应用于 groupby()
的每个元素。
这确实意味着您最终得到的是总和列表,而不是组。
您不能将求和应用于组并保留 .grouper
属性。为此,唯一的解决方案是使用实际循环:
{% for group in foo | groupby('a') %}
{{ group.grouper }}: {{ group.list | sum(attribute='b') }}
{% endfor %}
将输出 a
的每个不同值,后跟冒号和该组的属性 b
的总和。