20

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

ループでそれを行ういくつかの方法を考えることができますが、きちんとしたワンライナーがあるかどうかを特に知りたいです。

4

3 に答える 3

36

と組み合わせる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
于 2009-01-25T15:43:26.363 に答える
2

データのソース (peopleこの場合) が既にキーでソートされている場合は、sorted呼び出しをバイパスできます。

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

注:sortedが共通辞書の場合、順序は保証されません。したがって、電話する必要がありますsortedsortedここでは、collections.OrderedDictまたはその他の種類の順序付けられたデータ構造であると想定しています。

于 2015-02-06T15:04:07.870 に答える
1

以前の回答は、私の問題を解決するのに役立ちました。今後の参考のために、次のようなネストされたデータがある場合

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

次のように、City でグループ化し、次にその都市の Company でグループ化します。

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)
于 2015-06-08T04:34:08.243 に答える