1

並べ替え順序を失うことなく、並べ替えられたリストを jinja でグループ化することはできないようです。

テンプレートの例を次に示します。

{% set l = [{'c': 3, 'result': 1.0},
            {'c': 3, 'result': 2.0},
            {'c': 9, 'result': 3.0},
            {'c': 1, 'result': 4.0}] %}
{% for d in l|groupby('c') %}
    {{d}}
{% endfor %}

残念ながら、このテンプレートは以下を出力します:

(1, [{'c': 1, 'result': 4.0}])
(3, [{'c': 3, 'result': 1.0}, {'c': 3, 'result': 2.0}])
(9, [{'c': 9, 'result': 3.0}])

しかし、私が期待していたのは次のとおりです。

(3, [{'c': 3, 'result': 1.0}, {'c': 3, 'result': 2.0}])
(9, [{'c': 9, 'result': 3.0}])
(1, [{'c': 1, 'result': 4.0}])

私は絶対に事前にソートされた順序でアイテムを保持する必要があります.

これを達成する方法を知っている人はいますか?

4

3 に答える 3

0

@Blender がコメントで指摘したように、jinja はsorted渡されたリストを受け取ったキーに従ってソートするために使用します。

並べ替え順序を維持したい場合、唯一の解決策は独自の jinja-filter を作成することだと思います。

これを実現するために実装したフィルターは次のとおりです。

from jinja2 import environmentfilter
from itertools import groupby
from jinja2.filters import make_attrgetter, _GroupTuple
@environmentfilter
def do_groupby(environment, value, attribute):
    expr = make_attrgetter(environment, attribute)
    return map(_GroupTuple, groupby(value, expr))

注意: このフィルタは、受信したリストが正しくグループ化されている場合にのみ機能します(グループ インジケータは順番に並んでいる必要があります)。たとえば、次のリストは正しくグループ化されません。

[{'c': 3, 'result': 1.0},
 {'c': 9, 'result': 2.0},
 {'c': 3, 'result': 3.0},
 {'c': 1, 'result': 4.0}]
于 2013-07-13T06:13:35.287 に答える