es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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ón lower 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:

    {{ ", ".join([key.lower() + "=" + value.lower() for key, value in foo.items()]) }}
    

    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.

Comments are closed.