【问题标题】:Calculate set difference using jinja2 (in ansible)使用 jinja2 计算集差(在 ansible 中)
【发布时间】:2016-10-18 18:19:00
【问题描述】:

我的 ansible playbook 中有两个字符串列表,我试图在列表 A 中找到不在列表 B 中的元素 - 一组差异。但是,我似乎无法访问 python set 数据结构。这是我想要做的:

- set_fact:
    difference: "{{ (set(listA) - set(listB)).pop() }}"

但我收到一条错误消息 'set' is undefined。对我来说很有意义,因为它不是一个变量,但我不知道还能做什么。如何计算这两个列表的集合差异? ansible 中的 stock jinja 功能是不可能的吗?

【问题讨论】:

    标签: python ansible jinja2


    【解决方案1】:

    在通用 Jinja2 中,这可以很容易地实现,将 reject 过滤器与 in 测试相结合:

    "{{ listA | reject('in', listB) | first }}"
    

    这需要 Jinja >= 2.10

    【讨论】:

      【解决方案2】:

      原来有一个名为 differencebuilt-in filter for this in ansible(不是通用 jinja)。

      这完成了我在我的问题中尝试做的事情:

      "{{ (listA | difference(listB)) | first }}"
      

      【讨论】:

      • 有没有办法在不知道两个列表中哪个最大的情况下找到两个列表之间的差异?
      • @KostasDemiris 这将是一个很好的独立问题。
      • 没错,但幸好我找到了。 {{列表X |对称差异(listY)}}
      • @KostasDemiris 对称差异与两个列表之间的差异不同。如果一个集合不是另一个集合的子集,则操作数的顺序与集合差异有关,而对于对称差异则无关紧要,因为它们会给出不同的结果。例如:[1,2] | difference([2,3])[1],但 [1,2] | symmetric_difference([2,3])[1,3]。如果反转操作数,[2,3] | difference([1,2])[3],但 [2,3] | symmetric_difference([1,2]) 仍然是 [1,3]。所以,要小心!
      • 感谢您的澄清。差异是粗略的,但 symmetric_difference 是我正在寻找的。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多