tutorial significado sheet length jinja filters cheat async python flask jinja2

python - significado - jinja2 length of list



Ordenar dict en bucle jinja2 (2)

La forma en que está haciendo esto no funcionará, porque tan pronto como use {% for team in league %} , ya está usando el dictado sin clasificar y extrayendo la clave, par de valor de él.

Creo que |dictsort puede no ser capaz de ayudarlo en este caso porque no puede ordenar por clave o valor, sino por el valor del valor (sub-dict) para ''totalpts''.

En su lugar, debe ordenar este diccionario antes de pasarlo a la plantilla, de la siguiente manera:

>>> from collections import OrderedDict >>> league={''PEDD United'': {''id'': 37828, ''rank'': 12, ''totalpts'': 307},''Fc Mbonabushia'': {''id'': 205633, ''rank'': 6, ''totalpts'': 356},''FC Slurp'': {''id'': 933573, ''rank'': 11, ''totalpts'': 312},''KFC_Overijse'': {''id'': 38861, ''rank'': 5, ''totalpts'': 362},''Fc Paris'': {''id'': 1538051, ''rank'': 2, ''totalpts'': 396}} >>> league = OrderedDict(sorted(league.items(), key= lambda x: x[1][''totalpts''], reverse=True)) >>> print league OrderedDict([(''Fc Paris'', {''id'': 1538051, ''rank'': 2, ''totalpts'': 396}), (''KFC_Overijse'', {''id'': 38861, ''rank'': 5, ''totalpts'': 362}), (''Fc Mbonabushia'', {''id'': 205633, ''rank'': 6, ''totalpts'': 356}), (''FC Slurp'', {''id'': 933573, ''rank'': 11, ''totalpts'': 312}), (''PEDD United'', {''id'': 37828, ''rank'': 12, ''totalpts'': 307})])

Para ordenar el dict, lo convertimos en una lista de tuplas de (clave, valor) usando .items() . Suponiendo que x es una de estas tuplas, x [1] contiene el diccionario con la tecla ''totalpts''.

>>> league.items()[0] (''Fc Paris'', {''id'': 1538051, ''rank'': 2, ''totalpts'': 396}) # = x

Así que ahora x[1][''totalpts''] las tuplas usando x[1][''totalpts''] , usando reverse=True para un orden decreciente.

Un dict en sí no se puede ordenar, es un tipo de datos desordenado. Puede usar OrderedDict o simplemente usar tuplas:

>>> sorted(league.items(), key= lambda x: x[1][''totalpts''], reverse=True) [(''Fc Paris'', {''id'': 1538051, ''rank'': 2, ''totalpts'': 396}), (''KFC_Overijse'', {''id'': 38861, ''rank'': 5, ''totalpts'': 362}), (''Fc Mbonabushia'', {''id'': 205633, ''rank'': 6, ''totalpts'': 356}), (''FC Slurp'', {''id'': 933573, ''rank'': 11, ''totalpts'': 312}), (''PEDD United'', {''id'': 37828, ''rank'': 12, ''totalpts'': 307})]

Todavía estoy aprendiendo jinja2 y frasco y tengo dificultades para usar dictsort en jinja2.

Así que estoy pasando este dictado en una plantilla jinja2:

{''PEDD United'': {''id'': 37828, ''rank'': 12, ''totalpts'': 307},''Fc Mbonabushia'': {''id'': 205633, ''rank'': 6, ''totalpts'': 356},''FC Slurp'': {''id'': 933573, ''rank'': 11, ''totalpts'': 312},''KFC_Overijse'': {''id'': 38861, ''rank'': 5, ''totalpts'': 362},''Fc Paris'': {''id'': 1538051, ''rank'': 2, ''totalpts'': 396}}

Lo que quiero es crear una tabla que esté ordenada por el valor de la clave ''totalpts''. Intenté todo tipo de cosas y simplemente no se tienen en cuenta los puntos totales al "clasificar".

Aquí está uno de mis códigos:

<table class="table table-bordered"> {% for team in league %} <tr> <td>{{team}}</td> {% for data in league[team]|dictsort(league[team][''totalpts'']) %} <td>{{ league[team][''totalpts''] }}</td> {% endfor %} </tr> {% endfor %} </table>

por ello, no ordena nada en este caso ... Solo imprima el valor en la tabla sin orden ...

¿Alguien me puede ayudar?

Gracias


Podría clasificarlo en una lista sorted usando sorted :

league = sorted(league, key= lambda x: -league[x][''totalpts''])