jinja2 groupby对字典的自定义排序列表进行分组

时间:2018-08-02 11:32:48

标签: python dictionary jinja2

在Jinja中,groupby函数存在以下问题:

我有一个词典列表,每个词典里面的一个键是[Tech]:**some tech value**

我想以自定义方式进行排序和分组,假设我有

tech_order = [tech2, tech5, tech1, tech3, tech4] #these values are arbitrary just for example

当我仅使用python进行此操作

def custom_sort_list_dictated(Dict, Key, list_order):
    Dict = Dict.sort(key=lambda k:list_order.index(k[Key])) 
#Written as function because I pass it later in jinja2.Environment.globals.update()

custom_sort_list_dictated(My_list_of_dicts, 'Tech', tech_order) 
#This works and sorts my dictionaries correctly

for key, value in itertools.groupby(Anforderungen, key=itemgetter('Tech')):
            Val_list.append(list(value))    # Store group iterator as a list
            Key_list.append(key)

在python中使用itertools.groupby将根据我的tech_order列表对自定义排序的字典进行分组,并按顺序将它们分组。

但是jinja2中不是这种情况,我有以下模板:

{{ custom_sort_list_dictated(My_list_of_dicts, 'Tech', tech_order) or '' }}

{% for Tech, group_by_tech in My_list_of_dicts|groupby('Tech') %}
        {{ jinja_append_array(Val_Array, list(group_by_tech)) or '' }}
        {{ jinja_append_array(Key_Array, Tech) or '' }}
{% endfor %}

但是,与python中的groupby不同,jinja2中的itertools.groupby按字母顺序对字典进行了排序。有没有办法避免这种情况发生?

我知道问题出在jinja2 groupby上,因为只是打电话给了

{% for Tech, group_by_tech in My_list_of_dicts|groupby('Tech') %}
        {{ Tech + " ~~ " }}
{% endfor %} #This prints my techs in alphabetical order which is not consistent with itertools.groupby 

PS:jinja_append_arraycustom_sort_list_dictated使用jinja2.Environment.globals.update()从python传递到jinja

1 个答案:

答案 0 :(得分:0)

最终制作了自己的groupby()自定义函数,并将其传递给inja2.Environment.globals.update()如下:

import jinja2
import itertools
from operator import itemgetter


def custom_jinja_groupby(Dict, Key_list, Val_list, group_filter, parse_filter):
    temp_array = []
    for key, value in itertools.groupby(Dict, key=itemgetter(group_filter)):
        Key_list.append(key)
        for content in value:
            Parse_Info_Dictionary(content, parse_filter) #another custom function as I needed to make some changes to my grouping
            temp_array.append(content)
        Val_list.append(temp_array)
        temp_array=[]

template_file_loader = jinja2.FileSystemLoader('{}'.format(path_to_jinja_template_folder))
env = jinja2.Environment(loader = template_file_loader)
env.globals.update(custom_jinja_groupby = custom_jinja_groupby)

我可以在Jinja文件中使用它,如下所示:

{{ custom_jinja_groupby(My_Dict_To_Group, Key_Array, Val_Array, 'group_by_This', 'Custom_function_at_This') or '' }}

请注意使用or '',因为否则它将不打印任何内容到渲染文件中,这将使其不打印任何内容并仍然执行功能更改。我的目标是获取Key_Array和'Val_Array',它们通过引用传递给我,我猜是在jinja文件中,但这将在分组后几乎保持您的自定义顺序。希望这对以后的人有所帮助。