在字典列表中深度查找



我有一个任务,它返回下列字典的列表:

[
{
"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中前缀为pubtags,并返回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 }}"

<一口>

指出

  1. 测试
  2. 的完整剧本示例
- 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

最新更新