在jinja2循环中对字典的字典进行排序

12

我如何对字典进行排序?

my_dict = {
    'abc': {'name': 'B', 'is_sth': True},
    'xyz': {'name': 'A', 'is_sth': True}
}

在Jinja中,如何按name排序?

我尝试过{% for id, data in my_dict|dictsort(by='value') if data.is_sth %}但结果并不是我期望的。


你期望什么? - Jean-François Fabre
1
@Jean-FrançoisFabre 他期望的是{'xyz': {'name': 'A', 'is_sth': True}, 'abc': {'name': 'B', 'is_sth': True}} - eyettea
3个回答

27

Solution:

my_dict.items()|sort(attribute='1.name')


2
一些解释会有所帮助,我理解“name”,但“1.”是什么意思? - Ed Randall
5
.items() 返回一个包含两个元素的元组,第一个元素是键(key),第二个元素是值(value)。数字 1 表示第二个元素,也就是值,而 .name 表示内部字典中与该值对应的键。 - mvidalgarcia
这个答案建议您不需要使用'items()'调用:https://dev59.com/n3I-5IYBdhLWcg3wO1rl#5490174 - Stefan
所以我明白了,无论嵌套的复杂程度如何,我都可以以这种方式引用任何内部键,比如1.name.x.y.z? - nix-power

5

jinja2有一个完美的解决方案

do_dictsort(value, case_sensitive=False, by='key')

{% for item in mydict|dictsort %}
    sort the dict by key, case insensitive

{% for item in mydict|dicsort(true) %}
    sort the dict by key, case sensitive

{% for item in mydict|dictsort(false, 'value') %}
    sort the dict by key, case insensitive, sorted
    normally and ordered by value.

0
如果您能够接受在 Jinja 之外对数据进行排序,然后再进行显示,那么可以采用以下方式:
from jinja2 import Template
from collections import OrderedDict

tmplt = Template('''
{% for id, data in od.items() if data.is_sth %}
{{id}}, {{data}}
{% endfor %}
''')

od = OrderedDict((key, value) for key, value in
                 sorted(my_dict.items(), key=lambda x: x[1]['name']))

print(tmplt.render(od = od))

这给出:

xyz, {'name': 'A', 'is_sth': True}

abc, {'name': 'B', 'is_sth': True}

除此之外,您可能需要创建一个自定义过滤器


那样做也可以,但我更愿意在jinja中对其排序。实际上,我想我找到了一个解决方案: {% for id, data in my_dict.items()|sort(attribute='1.name') if data.is_sth %} - mvidalgarcia
@mvidalgarcia 哈!我也试着用类似的方法,但是没有正确地加上'1.name'周围的引号...你可以把你找到的东西发在答案里!(但只有在问题发布24小时后才能这样做,如果我没记错的话)。祝好运!(所以应该是my_dict.items()|sort(attribute='1.name'),对吗?) - hiro protagonist
哦,对不起上一个问题;你已经在评论中有了Jinja语句... - hiro protagonist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接