我如何映射键,在另一个字典中查找它们?

How can I map keys, looking them up in another dict?

鉴于这些词典:

somedict:
  key1: value1
  key2: value2
otherdict:
  key1: mapped1
  key2: mapped2

如何映射 somedict,通过在 Ansible 中的 otherdict 中查找来更改其键?结果应该是这样的:

mapped1: value1
mapped2: value2

似乎用这种声明性的东西应该是可行的:

{{ somedict | map(<MAP KEY>) | list }}

或者我真的必须为这种事情使用命令式循环吗?

以下

{{ somedict | map('extract', otherdict) | list }}

成功映射键,但在此过程中丢失了值...

Q: "The result should be this:"

mapped1: value1
mapped2: value2

答:下面的任务

    - debug:
        msg: "{{ somedict|
                 map('extract', otherdict)|
                 zip(somedict|
                     dict2items|
                     map(attribute='value'))|
                 list }}"

给出列表列表。这不是预期的结果

  msg:
  - - mapped1
    - value1
  - - mapped2
    - value2

要接收词典,请应用 dict 函数并删除 list 过滤器。例如

    - debug:
        msg: "{{ dict(somedict|
                      map('extract', otherdict)|
                      zip(somedict|
                          dict2items|
                          map(attribute='value'))) }}"

给予

  msg:
    mapped1: value1
    mapped2: value2

这可以进一步简化。下面的任务给出了相同的字典

    - debug:
        msg: "{{ dict(somedict|
                      map('extract', otherdict)|
                      zip(somedict.values())) }}"

笔记
  • 将字典转换为字典键列表中的列表结果。例如
    - debug:
        msg: "{{ somedict|list }}"

给予

  msg:
  - key1
  - key2
  • 字典键的列表也可以达到同样的效果
    - debug:
        msg: "{{ somedict.keys()|list }}"