有一個串列:
mylist: ['a_value', 'something_else']
有一個字典:
my_dict:
a_value:
something: true
bar:
foo: false
something_else:
placeholder: true
有一個 Ansible 任務可以為新的 dict 設定一個事實。
- name: "Create a new dict, when name(s) in the list match the key in the dict"
set_fact:
new_dict: "{{ new_dict | default({}) | combine({item.key: item.value}) }}"
loop:
- "{{ my_dict | dict2items }}"
- "{{ my_list }}"
when: my_list??? item
問:當名稱與 dict 中的鍵匹配時,我將如何配置 Ansible 以創建新的 dict?
在此示例中,所需的輸出:
new_dict:
a_value:
something: true
something_else:
placeholder: true
uj5u.com熱心網友回復:
您通過my_list在回圈中添加來使任務復雜化,為自己創建一個串列串列并使其變得比實際更復雜。
因此,作為第一步,您可以更正您的邏輯并執行以下操作:
- set_fact:
new_dict: "{{ new_dict | default({}) | combine({item.key: item.value}) }}"
loop: "{{ my_dict | dict2items }}"
when: item.key in my_list
vars:
my_list: ['a_value', 'something_else']
my_dict:
a_value:
something: true
bar:
foo: false
something_else:
placeholder: true
- debug:
var: new_dict
這使:
TASK [set_fact] *************************************************************************
ok: [localhost] => (item={'key': 'a_value', 'value': {'something': True}})
skipping: [localhost] => (item={'key': 'bar', 'value': {'foo': False}})
ok: [localhost] => (item={'key': 'something_else', 'value': {'placeholder': True}})
TASK [debug] ****************************************************************************
ok: [localhost] =>
new_dict:
a_value:
something: true
something_else:
placeholder: true
這就是說,有一種更短的方法,使用selectattr.
所以,有了這個單行:
- debug:
var: my_dict | dict2items | selectattr('key', 'in', my_list) | items2dict
vars:
my_list: ['a_value', 'something_else']
my_dict:
a_value:
something: true
bar:
foo: false
something_else:
placeholder: true
我們得到:
TASK [debug] ****************************************************************************
ok: [localhost] =>
my_dict | dict2items | selectattr('key', 'in', my_list) | items2dict:
a_value:
something: true
something_else:
placeholder: true
uj5u.com熱心網友回復:
從my_dict 中提取mylist項的值
_values: "{{ mylist|map('extract', my_dict) }}"
給
_values:
- something: true
- placeholder: true
然后創建new_dict
new_dict: "{{ dict(mylist|zip(_values)) }}"
給
new_dict:
a_value:
something: true
something_else:
placeholder: true
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/365721.html
下一篇:串列中的重復字典
