是否可以根据子属性对Jinja2中的对象列表进行排序?

时间:2018-03-20 09:12:20

标签: python templates jinja2

在我的情况下,我有一个包含其他几个dicts列表的dicts列表。

l = [{
'a': [
    { 'b': 4}
    ]
}, {
'a': [
    { 'b': 3}
    ]
}]

我在技术上喜欢做的是使用jinja2的排序过滤器对路径['a'] [0] ['b']进行排序。

有可能吗?

2 个答案:

答案 0 :(得分:2)

您可以编写自定义模板过滤器。

http://jinja.pocoo.org/docs/dev/api/#custom-filters

这将是一个粗略的解决方案(不支持反向,区分大小写等):

您应用中的某个地方:

def deep_sort(value, attribute, subattribute):
  return sorted(value, key=lambda element: element[attribute][0][subattribute])

environment.filters['deep_sort'] = deep_sort

在你的模板中:

        {% for value in l|deep_sort('a', 'b') %}
            {{value['a'][0]['b']}}
        {% endfor %}

答案 1 :(得分:0)

如果您愿意,可以在一行中尝试:

l = [{
'a': [
    { 'b': 4}
    ]
}, {
'a': [
    { 'b': 9}
    ]
},
 {
'a': [
    { 'b': 3}
    ]
}]
print(sorted(l,key=lambda x:x['a'][0]['b']))

输出:

[{'a': [{'b': 3}]}, {'a': [{'b': 4}]}, {'a': [{'b': 9}]}]

说明:

使用lambda你可以访问b的值,所以基本上sorted()将根据int的列表对这里的基础进行排序:

print(list(map(lambda x:x['a'][0]['b'],l)))

输出:

[4, 9, 3]

sorted()将对此列表进行排序。