Función map sobre los valores de un diccionario en una plantilla de Ansible Jinja.
Quiero convertir los valores de un diccionario en cadenas de caracteres y convertirlos a minúsculas, luego mapear el diccionario para unir cada par de elementos con un =
, y luego unir los elementos con una ,
.
Entrada de ejemplo:
{"A": "Aardvark", "B": "Beaver", "C": "Cat"}
Salida deseada:
A=aardvark,B=beaver,C=cat
En realidad, no me importa el orden en el que lleguen A, B, C, pero quiero asegurarme de que las claves y los valores no se mezclen al final, es decir, no A=cat
o algo similar.
Lo que estoy haciendo ahora es lo siguiente:
{{ foo.keys() | zip(foo.values() | map("lower")) | map("join", "=") | join(",") }}
Hasta ahora funciona con los datos de prueba que le he proporcionado. Sin embargo, no estoy seguro de que esto esté garantizado que sea correcto, y tampoco creo que sea la forma más eficiente o elegante de resolver esto. ¿Hay una manera mejor de aplicar la función lower
a los valores del diccionario?
Intenté usar dict2items
y especificar un atributo en la función map
, pero recibo un error sobre un argumento de palabra clave inesperado cuando lo hago, además de que es realmente feo:
{{ (foo | dict2items | map("lower", attribute="value") | list | items2dict).items() | map("join", "=") | join(",") }}
Nota: Estoy utilizando Ansible 2.9 con Python 3.5 en este momento, pero realmente me gustaría una solución que funcione independientemente de la versión de Python.
davy.ai
Una posible forma de mejorar la eficiencia y elegancia de la solución actual es utilizar una combinación de una comprensión de lista y la función
join
. Se puede aplicar la funciónlower
a cada valor del diccionario utilizando una comprensión de lista, y luego se puede unir la lista resultante utilizando=
para cada elemento y,
para unir todos los elementos juntos:Esto debería producir la salida deseada al mismo tiempo que es eficiente y fácil de leer. También es compatible con diferentes versiones de Python, ya que no utiliza ninguna característica específica de una versión en particular.