首页 > 解决方案 > 如何使用 Jinja2 计算 Json 中唯一值的数量?

问题描述

eq:json 喜欢:

{
  1: [
    {id: 1, name = "sam"},
    {id: 1, name = "sam"},
  ],
  2: [
    {id: 1, name = "p"},
    {id: 2, name = "e"},
  ],
  3: [
    {id: 2, name = "alice"}
  ],
  4: [
    {id: 3, name = "sam"}
  ]
}

因此,所需的输出:

1:应该给出值 count=1(名称:值不唯一)
2:应该给出值 count=2(两个名称:字段都是唯一的)
3:应该给出值 count=1(一个条目以及独特的)

很快...

于是写了代码:

{% for row in groups %} 
{% set count = namespace(value=0) %} 
<tr> {% for items in groups[row[0]] %} 
{% if 'name' in items %} 
{% set count.value = count.value + 1 %}
{% endif %}
{% endfor %}
<td>{{count.value}}</td>
</tr>

此代码仅计算条目数。不是唯一值计数。

标签: pythonhtmljinja2

解决方案


一般来说,您可能应该将此类逻辑放入您的 Python 代码中,正如评论者 yedpodtrzitko 所指出的那样。

如果您通过 Flask 使用 jinja2,最方便的方法可能是定义上下文处理器,如此处文档中所述

在我的示例中,我假设您正在处理 Python 字典,即使您的问题提到了 JSON,这可能表明对 jinja 可以访问的数据存在一些混淆。

{
    1: [
        {'id': 1, 'name': 'sam'},
        {'id': 1, 'name': 'sam'},
    ],
    2: [
        {'id': 1, 'name': 'p'},
        {'id': 2, 'name': 'e'},
    ],
    3: [
        {'id': 2, 'name': 'alice'}
    ],
    4: [
        {'id': 3, 'name': 'sam'}
    ]
}

假设您的示例中的 ID 唯一标识列表中的各个条目,一种有效的方法是使用集合仅包含唯一值的事实,而不是可以包含多个相同整数的列表:

@app.context_processor
def utility_processor():
    def count_unique_dicts(input_list):
        unique_ids = set([entry['id'] for entry in input_list])
        return len(unique_ids)

    return dict(count_unique_dicts)

然后,您可以在模板中使用此上下文处理器,如下所示:

{% for row in groups %}
Count: {{count_unique_dicts(row)}}
{% endear %}

推荐阅读