python - Jinja2 中的稳定排序

标签 python jinja2

可以应用 sort filter在 Jinja2 中依次按一个属性对列表进行排序,然后按另一个属性排序?这似乎是很自然的事情,但在我的测试中,前面的排序完全不稳定,所有排序都丢失了。

在将列表传递给模板之前,我已经通过先在 python 中进行排序来解决这个问题,但我想知道是否可以在 Jinja2 中对“稳定”进行排序。

我应用过滤器的方式是这样的:

{{ item_list|sort(attribute='value')|sort(attribute='color') }}

我希望看到的是按 color 排序的列表,元素共享按 value 排序的颜色。相反,它看起来就像从未发生过 value 排序一样。

例如,从这个列表中:

2 red
3 blue
3 red
2 blue
1 blue
4 red

我想要这样的东西:

1 blue
2 blue
3 blue
2 red
3 red
4 red

我查看了 groupby过滤器,但该实现似乎太复杂(需要嵌套 for 循环)。

最佳答案

我不知道有一个原生的 jinja2 过滤器可以做到这一点。要根据多个属性对列表进行排序,您可以定义一个 custom filter在 jinja2 中。

来自对 this question 的接受答案, 你可以写你自己的过滤器

import operator

def sort_multi(L,*operators): 
    L.sort(key=operator.itemgetter(*operators))
    return L

在您的应用程序环境中注册它。所以对于 pyramid,你会做类似的事情

env = config.get_jinja2_environment()
env.filters['sort_multi'] = sort_multi

最后在你的模板中

{{item_list|sort_multi('value','color')}}

关于python - Jinja2 中的稳定排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16143053/

相关文章:

python - 如何检查文件是否写入终端?

python - 如何绘制矢量化数学表达式函数?

Python Flask Jinja2 模板 null 错误

python - Flask/Mongo/Jinja - 切片 ListField 并显示数据库的最后条目

python - Pyramid 项目的 .jinja 模板中的 Vue.js

variables - Ansible 获取其他组变量

python - Pandas - 数据框名称列表?

python - 如何在Python中检查两个单词是否相邻?

python - TA-Lib 安装错误

python - 在 flask 中的 for 循环中呈现 i 值