我正在嘗試獲取以下 dict 鏈接串列:
family:
- {'name': 'lior', 'kidname': 'kid1'}
- {'name': 'lior', 'kidname': 'kid2'}
- {'name': 'lew', 'kidname': 'kid3'}
- {'name': 'lew', 'kidname': 'kid4'}
并將其轉換為串列字典:
{
'lior':['kid1', 'kid2']
'lew':['kid3', 'kid4']
}
我需要它作為set_factansible playbook 中的命令。到目前為止,我能夠創建它,但只有一個孩子(最后一個)
- set_fact:
names: "{{ names | default({}) | combine({ item.name: [item.kidname] }) }}"
with_items: "{{ family }}"
基本上我的問題是添加一個空串列并附加到它,就像我對密鑰所做的那樣。
謝謝你,利奧爾
uj5u.com熱心網友回復:
我編輯了您添加到串列的初始嘗試
---
- hosts: localhost
vars:
family:
- {'name': 'lior', 'kidname': 'kid1'}
- {'name': 'lior', 'kidname': 'kid2'}
- {'name': 'lew', 'kidname': 'kid3'}
- {'name': 'lew', 'kidname': 'kid4'}
tasks:
- set_fact:
names: "{{ names | default({}) | combine({ item.name: names[item.name] | default([]) [item.kidname] }) }}"
with_items: "{{ family }}"
- debug:
var: names
哪些輸出
TASK [debug] *******************************************************************
ok: [localhost] => {
"names": {
"lew": [
"kid3",
"kid4"
],
"lior": [
"kid1",
"kid2"
]
}
}
uj5u.com熱心網友回復:
使用過濾器groupby,例如
- set_fact:
names: "{{ dict(_names|zip(_kids)) }}"
vars:
_families: "{{ family|groupby('name') }}"
_names: "{{ _families|map('first')|list }}"
_kids: "{{ _families|map('last')|map('map', attribute='kidname')|list }}"
給
names:
lew:
- kid3
- kid4
lior:
- kid1
- kid2
uj5u.com熱心網友回復:
您可以使用defaultdict:
from collections import defaultdict
names = defaultdict(list)
for d in family:
names[d['name']].append(d['kidname'])
輸出:
>>> names
defaultdict(list, {'lior': ['kid1', 'kid2'], 'lew': ['kid3', 'kid4']})
uj5u.com熱心網友回復:
您可以使用自定義過濾器:
您創建一個檔案夾filter_plugins在你的劇本檔案夾(我已經命名的檔案myfilters.py和過濾器DictList)
#!/usr/bin/python
class FilterModule(object):
def filters(self):
return {
'DictList': self.DictList
}
def DictList(self, obj, ky, vl):
dict = {}
for d in obj:
key = d[ky]
if key in dict:
dict[key].append(d[vl])
else:
dict[key] = [d[vl]]
return dict
我已經構建了通用過濾器,您可以在其中通知鍵和值:
用:
- name: vartest
hosts: localhost
vars:
family:
- {'name': 'lior', 'kidname': 'kid1'}
- {'name': 'lior', 'kidname': 'kid2'}
- {'name': 'lew', 'kidname': 'kid3'}
- {'name': 'lew', 'kidname': 'kid4'}
tasks:
- name: display password
set_fact:
dictlist: "{{ family| DictList( 'name', 'kidname') }}"
- name: display result
debug:
msg: "{{dictlist}}"
結果:
ok: [localhost] => {
"msg": {
"lew": [
"kid3",
"kid4"
],
"lior": [
"kid1",
"kid2"
]
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334498.html
