Quel est l'équivalent idiomatique en Python de la balise de modèle "regrouper" de Django?

StackOverflow https://stackoverflow.com/questions/477820

  •  20-08-2019
  •  | 
  •  

Question

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

Je peux penser à quelques façons de le faire avec des boucles, mais j'aimerais particulièrement savoir s'il existe une solution simple et élégante.

Était-ce utile?

La solution

Combinez itertools.groupby avec operator.itemgetter pour obtenir une jolie solution:

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

Autres conseils

Les réponses précédentes m'ont aidé à résoudre mon problème. Pour référence future, si vous avez des données imbriquées comme

  

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

et que vous souhaitez regrouper par ville, puis par société dans cette ville, par exemple:

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

Je l'ai résolu en faisant ceci:

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)

Si la source de données (people dans ce cas) est déjà triée par la clé, vous pouvez ignorer l'appel sorted:

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

Remarque: Si collections.OrderedDict est un dictionnaire commun, il n'y a aucune garantie d'ordre. vous devez donc appeler <=>. Je suppose ici que <=> est un <=> ou un autre type de structure de données ordonnée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top