How to convert a dictionary to a list with key=value elements or to a string with key=value elements?

27 views
Skip to first unread message

Dmitriy Panteleyev

unread,
Oct 19, 2018, 1:55:24 PM10/19/18
to Ansible Project
Given an arbitrary dictionary like:

test:
  one
: wan
  two
: too
  three
: tree

How can I convert it to a list like:

test:
 
- one=wan
 
- two=too
 
- thee=tree

The end result that I need is actually a string of these list items ("one=one, two=too, three=tree").  I know that I can easily `join()` a list of items, but if there is an easier way to directly convert the dictionary to a string, that would work too.

Again, I know neither the number of dictionary elements, nor the key names.

A solution that works in version 2.5 would be best...

Matt Martz

unread,
Oct 19, 2018, 2:04:27 PM10/19/18
to ansible...@googlegroups.com
This should do the trick:

{{ test|dictsort|map('join', '=')|join(', ') }}

In my test, it produces:

ok: [localhost] => {
    "msg": "one=wan, three=tree, two=too"
}

It's ordered slightly different than your version, and dictsort could help change the sort order, however just a note that python dictionaries in most python versions are unsorted.

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/ad406797-d8bb-4735-bce4-41c9b71a2388%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


--
Matt Martz
@sivel
sivel.net

Dmitriy Panteleyev

unread,
Oct 19, 2018, 4:06:01 PM10/19/18
to Ansible Project
I'll give that a try, thank you.

Dmitriy Panteleyev

unread,
Oct 20, 2018, 11:59:07 AM10/20/18
to Ansible Project
Is there a way to modify this so that the item to the right of the equal sign was quoted?

So...  one="wan", two="too", three="tree"

Kai Stian Olstad

unread,
Oct 20, 2018, 1:01:32 PM10/20/18
to ansible...@googlegroups.com
On Saturday, 20 October 2018 17:59:07 CEST Dmitriy Panteleyev wrote:
> Is there a way to modify this so that the item to the right of the equal
> sign was quoted?
>
> So... one="wan", two="too", three="tree"

You can always use Jinja template

- debug: msg="{% for k, v in test.iteritems() %}{{ k }}="{{ v }}"{% if not loop.last %}, {% endif %}{% endfor %}"

--
Kai Stian Olstad


Dmitriy Panteleyev

unread,
Oct 20, 2018, 5:00:28 PM10/20/18
to Ansible Project
That is what I ended up doing, but was curious if there is a 'filter' way.
Reply all
Reply to author
Forward
0 new messages