在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_array
和custom_sort_list_dictated
使用jinja2.Environment.globals.update()
从python传递到jinja
答案 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文件中,但这将在分组后几乎保持您的自定义顺序。希望这对以后的人有所帮助。