Назад | Перейти на главную страницу

Как совместить два списка?

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

Поэтому я ищу способ как-то его оптимизировать. Я хочу получить все уникальные элементы из этого списка - скажем, settings в примере ниже:

инвентарь:

my_list:
  - { name: foo, settings: ['x', 'y', 'z'] }      
  - { name: bar, settings: ['x', 'y', 'q', 'w'] }

задачи:

- name: get all settings
  set_fact:
    all_settings="{{ my_list|map(attribute='settings')|list }}"

- name: show results
  debug:
    var=all_settings

полученные результаты:

"var": {
        "all_settings": [
            [
                "x",
                "y",
                "z"
            ],
            [
                "x",
                "y",
                "q"
                "w"
            ]
        ]
    }

Я застрял на этом. Как я могу объединить эти списки вместе?

Я ищу способ получить ['x', 'y', 'z', 'q', 'w']

Вам нужно использовать union.

С верхней части моей головы:

all_settings="{{ foo|map(attribute='settings')|union(bar|map(attribute='settings')) }}"

Как насчет этого ?

- name: get all settings
  set_fact:
    all_settings="{{ my_list|map(attribute='settings')|list|flatten|unique }}"

Похоже, это должно работать:

...
all_settings="{{ my_list|map(attribute='settings')|list | sum(start=[]) | unique }}"