python - tag - import django template
¿Cuál es el idiomático equivalente de Python a la etiqueta de plantilla de ''reagrupamiento'' de Django? (3)
Combina itertools.groupby
con operator.itemgetter
para obtener una solución bastante agradable:
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
http://docs.djangoproject.com/en/dev/ref/templates/builtins/#regroup
Puedo pensar en algunas formas de hacerlo con bucles, pero particularmente me gustaría saber si hay un buen line-up.
Si la fuente de datos ( people
en este caso) ya está ordenada por la clave, puede omitir la llamada sorted
:
iter = groupby(people, key=lambda x:x[''gender''])
for gender, people in iter:
print ''==='', gender, ''===''
for person in people:
print person
Nota: Si sorted
es un diccionario común, no hay garantías de orden; por lo tanto debe llamar sorted
. Aquí estoy suponiendo que sorted
es un collections.OrderedDict
u otro tipo de estructura de datos ordenados.
Las respuestas anteriores me ayudaron a resolver mi problema. Para referencia futura, si tiene algunos datos anidados como
{''city_name'': ''City1'', ''comp_name'': ''Company1'', ''name'': ''Branch1''}
y desea agrupar por Ciudad y luego por Empresa en esa ciudad como:
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
Lo solucioné al hacer esto:
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)