代码之家  ›  专栏  ›  技术社区  ›  Andy Baker

Python中与Django的“重组”模板标签相对应的惯用术语是什么?

  •  20
  • Andy Baker  · 技术社区  · 16 年前

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

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

    3 回复  |  直到 16 年前
        1
  •  30
  •   A Lee    14 年前

    结合 itertools.groupby 具有 operator.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
    
        2
  •  1
  •   Helpful Lurker    10 年前

    如果数据来源( people 在这种情况下)已经按关键字排序,您可以绕过 sorted 呼叫:

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

    注:如果 把…分类 是一本普通的词典,没有秩序的保证;因此,你必须打电话 把…分类 在这里,我假设 把…分类 是a collections.OrderedDict 或某种其他类型的有序数据结构。

        3
  •  0
  •   Euribates    10 年前

    以前的答案帮助我解决了问题。为了将来参考, 如果你有一些嵌套数据,比如

    {“城市名”:“城市1”,“公司名”:《公司1》,“名称”:《分支机构1》}

    你想按城市分组,然后按该城市的公司分组,比如:

    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)