gpt4 book ai didi

scripting - 在ansible中展平和过滤复杂的结构 - 字典列表的字典

转载 作者:行者123 更新时间:2023-12-02 22:32:26 25 4
gpt4 key购买 nike

我有以这种方式表示的数据:

 {
"key1": [{
"name": "some name1",
"index": "some idx1"
},
{
"name": "some name2",
"index": "some idx2"
},
{
"name": "some name3",
"index": "some idx3"
}],
"key2": [{
"name": "some name4",
"index": "some idx4"
},
{
"name": "some name5",
"index": "some idx5"
},
{
"name": "some name6",
"index": "some idx6"
}]
}

我想将上面的内容转换为这个,它基本上是一个字典,其中包含索引列表的现有键。

{ 
"key1": [some idx1, some idx2, some idx3],
"key2": [some idx4, some idx5, some idx6]
}

我已经看到了几个使用映射、提取和组合的示例,但还无法完全使其工作。不过我可以使用 jinja 来做到这一点,代码如下。我的问题是,实现上述目标的最佳方法是什么。对于这类事情,推荐的最佳实践是什么 - 有什么理由不应该使用 jinja2 来完成更复杂的操作(考虑到我见过的一个衬垫过于复杂,其他人可能很难理解) out - 因此使脚本难以维护)。

这是实现这一目的的代码,但同样,不确定是否是实现此目的的最佳方法:

- hosts: local
tags: test1
gather_facts: False
vars:
dict1:
key1:
- { name: some name1, index: some idx1 }
- { name: some name2, index: some idx2 }
- { name: some name3, index: some idx3 }
key2:
- { name: some name4, index: some idx4 }
- { name: some name5, index: some idx5 }
- { name: some name6, index: some idx6 }
tasks:
- name: "dict of list of dict"
set_fact:
index_map: |
{% set map = dict() %}
{% for k,v in dict1.iteritems() %}
{% set x=map.__setitem__(k, []) %}
{% for item in v %}
{% set x= map[k].append(item.name) %}
{% endfor %}
{% endfor %}
{{ map }}
- debug:
msg: "{{ index_map }}"

为了扩展这个问题,我试图解决更多问题:给定一个“索引”,我想找到与其关联的键。我认为目标结构会让我更容易做到这一点。因此,无论是键到索引列表的字典,还是索引到键的字典就足够了。

感谢您的建议..

最佳答案

Ansible 用于处理字典中键的工具相当有限(请参阅 this answer )。

但是dictsort过滤器有时会很方便,就像您的情况一样。
它将 dict 转换为列表,您可以使用 json_query 来处理它。

这是一个通过索引名称获取根键的任务:

- debug:
msg: "key is '{{ list_with_keys | json_query(qry) }}' for index {{ item }}"
vars:
list_with_keys: "{{ dict1 | dictsort | to_json | from_json }}"
qry: "[?contains(([1] | [].index),`{{ item }}`)][] | [0]"
with_items:
- some idx5
- some idx3

其中 dict1 取自您的示例。

关于scripting - 在ansible中展平和过滤复杂的结构 - 字典列表的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48494605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com