variable template tag registered one not must library ifequal examples python django django-templates

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)