Это ужасно. Дети, никогда не делайте этого!
У меня есть список (скажем, «данные»), в котором есть жалобы. Мне нужно добавить префикс и суффикс к каждой строке без использования циклов Ansible (например, потому что он уже находится в цикле или двух).
data: - string1 - string2
Мы хотим преобразовать его в (с чистой мощью jinja2):
new_data: - prefix_string1_postfix - prefix_string2_postfix
Решение
new_data: '{{ (["prefix_"] * data|length)|zip(data)|map("join")|zip(["_suffix"] * data|length)|map("join")|list }}'
Эм ... Xk’uzme?
Решение, объясненное
suffixes: '{{["_suffix"] * data|length }}' prefixes: '{{["prefix_"] * data|length }}' data_prefixes: '{{prefixes|zip(data)|map("join")|list}}' new_data: '{{data_prefixes|zip(suffixes)|map("join")|list}}
Решение, объяснил, объяснил
suffixes: '{{["_suffix"] * data|length }}' prefixes: '{{["prefix_"] * data|length }}'
suffixes
: массив '_suffix' * N раз, где N == длина (данные). prefixes
: массив 'prefix_' * N раз, где N == длина (данные).
Оба используют Уловка Python, это [‘a’]*3 == [‘a’, ‘a’, ‘a’]
. Нам нужно, чтобы эти массивы имели тот же размер, что и наш массив данных, чтобы использовать zip-фильтр.
data_prefixes: '{{prefixes|zip(data)|map("join")|list}}'
prefixes|zip(data)
создает список списка: [[‘prefix_’, ‘string1’], [‘prefix_’, ‘string2']]
.
map («join») применяет «join» (без аргументов) к внутреннему списку. Получается: [‘prefix_string1’, ‘prefix_string2']
. Последний «list
» предназначен только для помощи debug
с выводом (карта возвращает genexpr
python вместо списка, поэтому мы преобразуем его обратно в список). Нам это не нужно в полноценной производственной среде.
new_data: '{{data_prefixes|zip(suffixes)|map("join")|list}}
Точно такой же трюк. map data_prefixes с суффиксами для создания вложенного списка:
[['prefix_string1', '_suffix'], ['prefix_string2', '_suffix']]
Затем мы присоединяемся и снова конвертируем в список:
['prefix_string1_suffix', 'prefix_string2_suffix']
.
Пост скриптум
Я хотел бы сказать: «Никогда не используйте это в производстве», за исключением того, что я разрабатываю эту ужасную технику, чтобы избежать более распространенных ужасов в моем производстве. Грустно, грустно, jinja2.
Регулярные выражения?
На следующий день после того, как я написал эту статью, akint показал мне более простое решение. Мне стыдно, потому что на этот раз регулярные выражения упрощают задачу:
new_data: '{{ data | map("regex_replace", "^(.*)$", "prefix_\1_suffix") | list }}'