<一口>
我有一个任务,它返回下列字典的列表:
[
{
"state": available
"id": "obj-1"
"tags": {
"Name": "pub-obj-1"
}
},
{
"state": available
"id": "obj-2"
"tags": {
"Name": "pub-obj-2"
}
},
{
"state": available
"id": "obj-3"
"tags": {
"Name": "pvt-obj-3"
}
}
]
我需要基于标签执行查找,在名称中使用前缀pub
,并在新列表中返回这些对象的id
字段。正确的做法是什么?
Q:"查找Name
中前缀为pub
的tags
,并返回id
。">
A:过滤器json_query完成工作
pub: "{{ out|json_query('[?tags.Name|starts_with(@, `pub`)].id') }}"
为
pub:
- obj-1
- obj-2
也可以使用过滤器selecattr和匹配前缀
pub: "{{ out|selectattr('tags.Name', 'match', 'pub')|
map(attribute='id')|list }}"
<一口>
指出
- 测试 的完整剧本示例
- hosts: localhost
vars:
out:
- id: obj-1
state: available
tags:
Name: pub-obj-1
- id: obj-2
state: available
tags:
Name: pub-obj-2
- id: obj-3
state: available
tags:
Name: pvt-obj-3
pub: "{{ out|json_query('[?tags.Name|starts_with(@, `pub`)].id') }}"
pu2: "{{ out|selectattr('tags.Name', 'match', 'pub')|
map(attribute='id')|list }}"
tasks:
- debug:
var: pub
- debug:
var: pu2
- 修复JSON
[
{
"id": "obj-1",
"state": "available",
"tags": {
"Name": "pub-obj-1"
}
},
{
"id": "obj-2",
"state": "available",
"tags": {
"Name": "pub-obj-2"
}
},
{
"id": "obj-3",
"state": "available",
"tags": {
"Name": "pvt-obj-3"
}
}
]
一口>您可以使用带有if
子句的列表推导式来根据标签名称过滤子词典。
给定您的输入列表为lst
:
[d['id'] for d in lst if d['tags']['Name'].startswith('pub-')]
演示:https://replit.com/@blhsing/RingedUnpleasantDemand