如何在Jinja中输出collections.defaultdict(list)的嵌套列表结果?
我的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 %}
count
是 length
的别名。
在 Jinja 中没有 xrange()
这个函数,但你可以使用 range()
。