http://docs.djangoproject.com/en/dev/ref/templates/builtins/#regroup
ループでそれを行ういくつかの方法を考えることができますが、きちんとしたワンライナーがあるかどうかを特に知りたいです。
http://docs.djangoproject.com/en/dev/ref/templates/builtins/#regroup
ループでそれを行ういくつかの方法を考えることができますが、きちんとしたワンライナーがあるかどうかを特に知りたいです。
と組み合わせる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
データのソース (people
この場合) が既にキーでソートされている場合は、sorted
呼び出しをバイパスできます。
iter = groupby(people, key=lambda x:x['gender'])
for gender, people in iter:
print '===', gender, '==='
for person in people:
print person
注:sorted
が共通辞書の場合、順序は保証されません。したがって、電話する必要がありますsorted
。sorted
ここでは、collections.OrderedDict
またはその他の種類の順序付けられたデータ構造であると想定しています。
以前の回答は、私の問題を解決するのに役立ちました。今後の参考のために、次のようなネストされたデータがある場合
{'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)