可以在Jinja2中连续应用排序过滤器,先按一个属性排序列表,然后再按另一个属性排序?这似乎是一件很自然的事情,但在我的测试中,前面的排序完全不稳定,所有排序都丢失了.
我已经通过在将列表传递给模板之前首先在python中进行排序来解决它,但我想知道是否可以在Jinja2中对"稳定"进行排序.
我应用过滤器的方式是这样的:
{{ item_list|sort(attribute='value')|sort(attribute='color') }}
Run Code Online (Sandbox Code Playgroud)
我希望看到的是列表排序依据color,元素共享一个颜色排序value.相反,它看起来好像value从未发生过排序.
例如,从此列表中:
2 red
3 blue
3 red
2 blue
1 blue
4 red
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西:
1 blue
2 blue
3 blue
2 red
3 red
4 red
Run Code Online (Sandbox Code Playgroud)
我查看了groupby过滤器,但该实现看起来太复杂了(需要嵌套for循环).
我不知道可以做到这一点的本机jinja2过滤器.要基于多个属性对列表进行排序,可以在jinja2中定义自定义过滤器.
从这个问题的接受答案中,您可以编写自己的过滤器
import operator
def sort_multi(L,*operators):
L.sort(key=operator.itemgetter(*operators))
return L
Run Code Online (Sandbox Code Playgroud)
在您的应用程序环境中注册它.所以pyramid,你会做类似的事情
env = config.get_jinja2_environment()
env.filters['sort_multi'] = sort_multi
Run Code Online (Sandbox Code Playgroud)
最后在你的模板中
{{item_list|sort_multi('value','color')}}
Run Code Online (Sandbox Code Playgroud)