繁体   English   中英

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

[英]Is it possible to sort a list of objects in Jinja2 based on subattributes?

就我而言,我有一个字典列表,其中包含其他几个字典列表。

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

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

有可能吗?

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

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 %}

如果需要,可以在一行中尝试:

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()将基于此列表进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM