【问题标题】:compare two list of tuples for jinja2比较 jinja2 的两个元组列表
【发布时间】:2015-05-14 20:25:47
【问题描述】:

所以这就是交易。我有一些用于创建电子邮件的日志文件。我使用列出日志文件内容的 jinja 模板。但是,我决定添加一些数据指标,以显示最近几天日志的变化。好的

我的数据保存为 csv 文件,我将它们加载为元组列表,格式为 [ ('string',int,int), (...) ] 我知道如何使用列表比较“字符串”索引的理解,如果它们相等,则检查元组中的最后一个 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

我想要一种方法来比较这两个列表的第三个整数,并动态地将跨度添加到表中,以说明增加或减少。谢谢你,我希望我问的正确。

【问题讨论】:

    标签: python list jinja2 list-comprehension


    【解决方案1】:

    你的函数有点奇怪(你为什么使用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)]
    

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

    【讨论】:

    • 我想也许你在这里是在正确的轨道上但是我不明白你的代码中的一些东西,即你传递给 diff_to_int() 的东西。 new_tuple[2] 和 old_tuple[2] 有什么用?新的 4-tple 列表是个好主意,因此它只是 new_list 的副本,其中添加了增加、减少或不减少 (1,0,-1) 字段。我想也许列表理解需要修改。我会尝试它的一些变体。
    • 另外我想提一下,这两个列表可能不一定是相同的大小或具有完全相同的内容。只有元组中的两个字符串匹配,我们才关心检查第二个 int 值是否有变化。
    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2016-11-22
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多