Ansible – объединить/сгладить список списков

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

my_dict:
  my_list_a:
    - a
    - b
    - c
  my_list_b:
    - a
    - d
    - e
  list_c:
    - f
  1. Как мне сгладить эту структуру/объединить внутренние элементы в список в следующем формате через jinja2 (сохранение порядка не важно для меня в моем текущем варианте использования, но это всегда приятно, когда это возможно).
my_combined_list:
  - a
  - b
  - c
  - a
  - d
  - e
  - f

К сожалению, поскольку о понимании списков не может быть и речи из-за отсутствия поддержки в Jinja, мне пока не удалось собрать решение воедино.

Есть также некоторые дополнительные вещи, которые мне нужно сделать, хотя большинство из них легко выполнимо в окончательном списке (дедупликация, сортировка и т. д.). Во время присоединения необходимо сделать следующее:

  1. select или reject на основе теста (например, включать только списки, начинающиеся со строки: my_ означает, что list_c не добавляется к конечному результату)

Я нашел много способов создания списка диктовок или различных более сложных особых случаев, но, похоже, я ничего не могу найти о составлении списка всех внутренних элементов списка списков элементов.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вопрос: Сведите внутренние элементы в список.

О: Самый простой вариант

my_combined_list: "{{ my_dict.values() | flatten }}"

дает

my_combined_list: [a, b, c, a, d, e, f]

Вопрос: Выберите или отклоните на основе теста (начальная строка: my_, например, list_c опущен).

О: Например, используйте тест совпадение

allow_match: [my_]
my_combined_list: "{{ my_dict | dict2items |
                      selectattr('key', 'match', allow_match|join('|')) |
                      map(attribute='value') | flatten }}"

дает

my_combined_list: [a, b, c, a, d, e]

Example of a complete playbook for testing

- hosts: localhost

  vars:

    my_dict:
      my_list_a: [a, b, c]
      my_list_b: [a, d, e]
      list_c: [f]

    my_combined_list: "{{ my_dict.values() | flatten }}"
    allow_match: [my_]
    my_combined_lis2: "{{ my_dict | dict2items |
                          selectattr('key', 'match', allow_match|join('|')) |
                          map(attribute='value') | flatten }}"

  tasks:

    - debug:
        var: my_combined_list | to_yaml
    - debug:
        var: my_combined_lis2 | to_yaml

Другие вопросы по теме