与 Django 的“重组”模板标签等效的惯用 Python 是啥?

Posted

技术标签:

【中文标题】与 Django 的“重组”模板标签等效的惯用 Python 是啥?【英文标题】:What's the idiomatic Python equivalent to Django's 'regroup' template tag?与 Django 的“重组”模板标签等效的惯用 Python 是什么? 【发布时间】:2010-10-03 10:21:30 【问题描述】:

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#regroup

我可以想到几种使用循环的方法,但我特别想知道是否有一个简洁的单行。

【问题讨论】:

【参考方案1】:

以前的答案帮助我解决了我的问题。备查, 如果您有一些嵌套数据,例如

'city_name': 'City1', 'comp_name': 'Company1', 'name': 'Branch1'

您想按城市分组,然后按该城市的公司分组,例如:

City1
 Company 1
   Branch 1
   Branch 2
 Company 2
   Branch 1
 Company 3
   Branch 1
City2
 Company 2
   Branch 1
 Company 3
   Branch 1
   Branch 2
City3
 Company 1
   Branch 1
 Company 2
   Branch 1
   Branch 2

我通过这样做解决了它:

key = itemgetter('city_name')    
iter = groupby(queryset, key=key) # assuming queryset is already sorted by city_name

for key, group in iter:
    print(key)
    key2 = itemgetter('company_name')
    iter2 = groupby(sorted(group, key=key2), key=key2) # now we must sort by company_name
    for comp, branch in iter2:
        print(comp)
        for b in branch:
            print(b)

【讨论】:

【参考方案2】:

如果数据源(本例中为people)已经按key排序,则可以绕过sorted调用:

iter = groupby(people, key=lambda x:x['gender'])
for gender, people in iter:
    print '===', gender, '==='
    for person in people:
        print person

注意:如果sorted是通用字典,则不保证顺序;因此您必须致电sorted。这里我假设sortedcollections.OrderedDict 或其他某种有序数据结构。

【讨论】:

【参考方案3】:

itertools.groupbyoperator.itemgetter 结合起来,得到一个非常好的解决方案:

from operator import itemgetter
from itertools import groupby

key = itemgetter('gender')
iter = groupby(sorted(people, key=key), key=key)

for gender, people in iter:
    print '===', gender, '==='
    for person in people:
        print person

【讨论】:

如果数据源已经按key排序,可以绕过sorted调用。请参阅下一条评论以查看示例。 仍然是一个非常干净的解决方案,尽管iter 是内置的,可能不是变量名的最佳选择,而且print() 自 Python 3 以来也已更新。对于那些好奇的人,Django 在内部使用groupby 作为其regroup 模板标签。

以上是关于与 Django 的“重组”模板标签等效的惯用 Python 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 模板中使用带有 blocktrans 的 urlize 过滤器的惯用方式

6.Django-模板常用标签

视图中等效的Django staticfiles静态模板帮助器(Python代码)[重复]

django 中的模板标签会执行两次吗?

Django 简单模板标签问题

AngularJS 与 Django - 冲突的模板标签