使用 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 的总和。