如何在Jinja中输出collections.defaultdict(list)的嵌套列表结果?

2 投票
2 回答
912 浏览
提问于 2025-04-18 09:42

我的Python代码

d = collections.defaultdict(list)
for k in results:
  d[k[0]].append(k[1:4])

e= collections.OrderedDict(sorted(d.items(), key=lambda t: t[0]))

for key,value in e.items():
    for p in xrange(len(value)):
        print value[p][0]

我想做的事情

我该如何从这段代码中在jinja里选择值呢?

for key,value in e.items():
    for p in xrange(len(value)):
        print value[p][0]

我以为可以这样做:

  {%for key, value in groups.items()%}
    {%for p in xrange(len(value))%}
  <tr>
    <td>{{value[p][1]}}</td><td>{{value[p][2]}}</td><td>{{value[p][4]}}</td>
    <td>{{value[p][5]}}</td><td>{{value[p][3]}}</td>
  </tr>
   {%endfor%}
  {%endfor%}

不过这会产生一个错误

jinja2.exceptions.UndefinedError: 'len' is undefined

2 个回答

0

正如 @Martijn Pieters 所说,你可以遍历 list 里的元素,但要解释为什么会出现那个异常:

len 是未定义的,但你可以用 length() 来代替:

文档中提到的 length 会返回一个序列或映射中的项目数量。你可以在 这里 了解更多信息。

另外,要获取长度,你也可以使用 count(),比如 list_size = my_list.count()

3

不要使用 xrange();你可以直接遍历值列表:

{%for key, value in groups.items()%}
  {%for elem in value %}
    <tr>
      <td>{{ elem[1] }}</td><td>{{ elem[2] }}</td><td>{{ elem[4] }}</td>
      <td>{{ elem[5] }}</td><td>{{ elem[3] }}</td>
    </tr>
  {%endfor%}
{%endfor%}

如果你需要获取一个对象(比如列表)的长度,在 Jinja 模板中,可以使用 length 过滤器

{% if value|length < 5 %}Short list!{% endif %} 

countlength 的别名。

在 Jinja 中没有 xrange() 这个函数,但你可以使用 range()

撰写回答