как вы выводите результаты collections.defaultdict(список) из вложенного списка в jinja?

#python #jinja2

#python #jinja2

Вопрос:

Мой код на 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
  

Ответ №1:

Не используйте 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() .

Ответ №2:

как сказал @Martijn Pieters, вы можете выполнять итерации по list элементам, но для того, чтобы ответить, почему вы получаете это исключение:

len не определено, но вы можете использовать length() insted:

длина, как написано в документах, вернет количество элементов последовательности или сопоставления. Вы можете прочитать больше здесь

Также для получения списка, который вы можете использовать count() , например list_size = my_list.count()