从列表中删除空值并将其分配给新列表

问题描述 投票:0回答:2

我使用任务收集的值在 Ansible 中生成了一个列表。
在该列表中,有空字符串,因为某些键没有分配给它们的值。
所以,我想要实现的目标是将该列表分配给一个新列表,但没有那些空值。

list1: [
   "a",
   "b",
   "",
   "7",
   ""
]

我尝试了以下方法,但似乎不起作用:

set_fact:
  list2: "{{ list1 1 | rejectattr('') |list }}"

有人能够指出我做错了什么并为我的问题提供解决方案吗?

Ansible 版本:2.9.1

ansible
2个回答
30
投票

问:从list1中删除空值[“a”,“b”,“”,“7”,“”]

A:使用过滤器选择。引用:

“如果未指定测试,则每个对象将被评估为布尔值。”

    - set_fact:
        list2: "{{ list1|select() }}"
      vars:
        list1: ["a", "b", "", "7", ""]

给予

    list2: [a, b, '7']

问:如果某个元素为0或False?

A:0False都计算为布尔值False。过滤器select也会删除它们

    - set_fact:
        list2: "{{ list1|select() }}"
      vars:
        list1: ["a", "b", 0, "7", False, ""]

给出相同的结果

    list2: [a, b, '7']

拒绝空字符串仅使用测试匹配

    - set_fact:
        list2: "{{ list1|reject('match', '^$') }}"
      vars:
        list1: ["a", "b", 0, "7", False, ""]

给予

    list2: [a, b, 0, '7', false]

0
投票

请尝试如下

  vars:
   list1: [ "a", "b", "", "7", "" ]
   list2:  []

  tasks:
  - name: test
    set_fact:
     list2: "{{list2  + [item]}}"
    when: item != ""
    with_items:
     - "{{list1}}"

输出

ok: [localhost] => {
    "msg": [
        "a",
        "b",
        "7"
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.