比较jinja2的两个元组列表

时间:2015-05-14 20:25:47

标签: python list jinja2 list-comprehension

所以这是交易。我有一些日志文件,我用来创建一个电子邮件。我使用jinja模板列出了日志文件的内容。但是,我决定添加一些数据指标,以显示上次日志日志的变化。确定

我的数据保存为csv文件,我将它们加载为元组列表,形式为[('string',int,int),(...)]我知道怎么做是使用一个列表理解比较'string'索引,如果它们相等,检查元组中的最后一个int。如果该整数更大,我添加一个显示增加的小箭头,如果更低,则显示减少的箭头。

到目前为止,我有点想做什么。例如,这是在jinja模板文件中填充我的表的代码片段

  {% for f,r,u in data %}
  <tr>
    <td class="tg-031e"><span style="color:blue;font-weight:bold">&#9650</span>{{f}}</td>
    <td class="tg-031e">{{r}}</td>
    <td class="tg-031e">{{u}}</td>
  </tr>
  {% endfor %}

如果比较结果小于。

,我还没有添加条件以显示向下箭头

我想出了一个非常糟糕的功能来测试列表的比较。我对它的运作情况并不感到满意。

def change(l1, l2):
    inc = [x[0] for x,y in zip(l1,l2) if x[0] == y[0] and x[2] > y[2] ]
    dec = [x[0] for x,y in zip(l1,l2) if x[0] == y[0] and x[2] < y[2] ]
    yield inc, dec

我想要的是一种比较这两个列表的第三个整数的方法,并动态地将范围添加到表中,说明增加或减少。谢谢,我希望我说得对。

1 个答案:

答案 0 :(得分:0)

你的功能有点奇怪(你为什么使用yield?),但它主要在那里;只有,如果我理解正确,你真的想要在数据中添加第四个字段,这样你就可以这样做:

{% for f,r,u, inc_dec in four_tuples %}
<tr>
  <td class="tg-031e"><span style="color:blue;font-  weight:bold">&#9650</span>{{f}}</td>
  <td class="tg-031e">{{r}}</td>
  <td class="tg-031e">{{u}}</td>
  <td>
  {% if inc_dec == -1 %}
      <!-- show decrease image -->
  {% else if inc_dec == 1 %}
      <!-- show increase image -->
  {% endif %}
  </td>
</tr>
{% endfor %}

如果l1l2分别为new_listold_list,那么您应该可以执行以下操作:

def diff_to_int(a, b):
    if a < b:
       return -1
    elif a == b:
       return 0
    else:
       return 1


def change(new_list, old_list):
     """
     :type new_list: list[(str, int, int)]
     :type old_list: list[(str, int, int)]
     :rtype list[int]
     """
     return [diff_to_int(new_tuple[2], old_tuple[2])
             for new_tuple, old_tuple
             in zip(new_list, old_list)]


inc_dec_list = change(new_data, old_data)

然后,为了使你的每个3元组成为一个带有额外字段的4元组,显示它是增加,减少还是静态,你可以这样做:

four_tuples = [(a, b, c, inc_dec_static) 
               for (a, b, c), inc_dec_static
               in zip(new_data, inc_dec_list)]

然后将其传递到您的模板中。