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