繁体   English   中英

Jinja2 将列表映射到字典

[英]Jinja2 map list to dictionary

是否可以使用 Jinja2 使用列表/映射理解将原语列表转换为字典列表?

鉴于这种结构:

list:
  - some_val
  - some_val_2

在每个元素上应用map以获得:

list:
  - statically_added: some_val
  - statically_added: some_val_2

也可以采用其他方式: list_from_example|map(attribute="statically_added")|list

我提出了同样的问题并找到了这个解决方案:

- debug:
    msg: "{{ mylist | json_query('[].{\"statically_added\": @}') }}"
  vars:
    mylist:
      - some_val
      - some_val_2

输出:

ok: [localhost] => {
    "msg": [
        {
            "statically_added": "some_val"
        },
        {
            "statically_added": "some_val_2"
        }
    ]
}

我最终编写了自己的微型过滤器。 我正在使用 Ansible,但我希望它也可以适用于其他环境。

对于 Ansible,将其放入文件filter_plugins/singleton_dict.py

class FilterModule(object):

    def filters(self):
        return {
            'singleton_dict':
                lambda element, key='singleton': {
                    key: element
                }
        }

然后[1, 2]|singleton_dict(key='name')产生[{'name': 1}, {'name': 2}] 如果未指定key= ,则默认为'singleton'

其实很简单。 至少,这在 Ansible 中有效:

vars:
  my_list:
    - some_val
    - some_val_2
  dict_keys:
    - key_1
    - key_2
tasks:
  - debug:
      msg: "{{ dict(dict_keys | zip(my_list)) }}"

输出:

TASK [debug] *******************************
ok: [localhost] => {
    "msg": {
        "key_1": "some_val",
        "key_2": "some_val_2"
    }

}

请注意,您必须提供一个键列表,并且它们需要是不同的(字典的性质意味着键不能相同)。

更新。 刚意识到标题有点误导,我回答的是标题,而不是实际问题。 但是,我将保持原样,因为我相信很多人会在谷歌上将列表转换为字典并找到这篇文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM