如何在Ansible中将列表转换为元素出现次数字典并统计哈希中符合条件对象的出现次数
在Ansible中统计列表元素出现次数的解决方案
没问题!我来教你怎么把你的原始变量转换成目标格式,核心就是用Ansible的过滤器组合来统计每个数字的出现次数。
原始变量与目标格式回顾
你的原始变量是:
variable: identifier_1: - 1 - 2 - 1 - 1 identifier_2: - 1 - 2 - 3
想要转换成的目标格式:
variable: identifier_1: - 1: 3 - 2: 1 identifier_2: - 1: 1 - 2: 1 - 3: 1
实现方法:用Ansible过滤器组合处理
你可以通过dict2items、groupby、map和items2dict这些过滤器的组合,一行表达式就能完成转换。下面是完整的Playbook示例:
- name: 统计列表中数字的出现次数 hosts: localhost vars: # 你的原始变量 variable: identifier_1: - 1 - 2 - 1 - 1 identifier_2: - 1 - 2 - 3 # 处理后的变量,用过滤器组合实现统计 processed_variable: >- {{ variable | dict2items # 把原字典拆成[{key: 'identifier_1', value: [1,2,1,1]}, ...]的列表 | map('combine', { 'value': item.value | groupby('self') # 按数字本身分组,得到[(1, [1,1,1]), (2, [2])] | map('zip', item.value | groupby('self') | map('last') | map('length')) # 把数字和对应出现次数配对 | map('dict') # 把每对转换成字典,比如{1:3} | list # 转成字典列表 }) | items2dict # 把处理后的列表转回字典 }} tasks: - name: 输出处理后的结果 debug: var: processed_variable
过滤器作用拆解
我来逐个解释上面用到的过滤器,帮你理解逻辑:
dict2items: 将原始的嵌套字典转换成键值对列表,方便后续逐个处理每个identifier对应的数字列表。groupby('self'): 对每个数字列表按元素自身的值分组,比如[1,2,1,1]会被分成[(1, [1,1,1]), (2, [2])],每个元组的第一个元素是分组的数字,第二个是该数字的所有出现项。map('last') | map('length'): 提取每个分组的列表部分,然后获取列表长度(也就是该数字的出现次数),比如上面的分组会得到[3, 1]。map('zip', ...): 将分组的数字和对应的次数配对,得到[(1,3), (2,1)]这样的元组列表。map('dict'): 把每个元组转换成单个键值对的字典,比如(1,3)变成{1:3}。list: 将这些单个字典组合成列表,也就是[{1:3}, {2:1}]。combine: 把处理后的value替换回原来的键值对条目里。items2dict: 把处理后的键值对列表重新组合成嵌套字典,得到最终的目标格式。
运行结果
执行这个Playbook后,你会得到完全符合需求的输出:
TASK [输出处理后的结果] ********************************************************************* ok: [localhost] => { "processed_variable": { "identifier_1": [ { "1": 3 }, { "2": 1 } ], "identifier_2": [ { "1": 1 }, { "2": 1 }, { "3": 1 } ] } }
内容的提问来源于stack exchange,提问作者Pedro Ribeiro
相关产品推荐
相关产品推荐

