gpt4 book ai didi

filter - Ansible 过滤字典列表以仅在一个字段中包含唯一值

转载 作者:行者123 更新时间:2023-12-04 10:29:20 25 4
gpt4 key购买 nike

我在一个 ansible 变量中有一个字典列表。一些字典在字段 'id 和字段 'name' 中具有相同的值,而在其他键值对(对我来说不重要)中它们不同。我想过滤掉所有与 'name''id' 字段“重复”的字典。

例子:

[{
"name": "abc",
"id": "123456",
"other_key": "unimportant value"
},
{
"name": "abc",
"id": "123456",
"other_key": "another unimportant value"
},
{
"name": "bcd",
"id": "789012",
"other_key": "unimportant value"
}]

期望的结果:

[{
"name": "abc",
"id": "123456"
},
{
"name": "bcd",
"id": "789012"
}]

我如何在 Ansible 中实现这一目标? ('other_key' 变量不一定必须被丢弃,它也可能只是第一次出现,这无关紧要)。

我已经生成了一个唯一 ID 列表:

{{ mydictionaries | map(attribute='id') | unique | list }}

但是我该如何过滤字典列表呢?

最佳答案

问题:“过滤掉关于‘name’和‘id’字段‘重复’的字典。”

更新。

A:给定列表

  my_list:
- {id: '123456', name: abc, other_key: unimportant value}
- {id: '123456', name: abc, other_key: another unimportant value}
- {id: '789012', name: bcd, other_key: unimportant value}

声明变量

  my_hash: "{{ my_list|json_query('[].[name, id]')|
map('join')|
map('hash')|
map('community.general.dict_kv', 'hash') }}"
my_list2: "{{ my_list|zip(my_hash)|map('combine') }}"
my_dict3: "{{ dict(my_list2|groupby('hash')|
map('last')|
map('first')|
json_query('[].[name, id]')) }}"
my_list3: "{{ my_dict3|dict2items(key_name='name', value_name='id') }}"

给予

  my_hash:
- {hash: 370194ff6e0f93a7432e16cc9badd9427e8b4e13}
- {hash: 370194ff6e0f93a7432e16cc9badd9427e8b4e13}
- {hash: f3814d5b43a4d67d7636ec64be828d82a92eedbb}

my_list2:
- hash: 370194ff6e0f93a7432e16cc9badd9427e8b4e13
id: '123456'
name: abc
other_key: unimportant value
- hash: 370194ff6e0f93a7432e16cc9badd9427e8b4e13
id: '123456'
name: abc
other_key: another unimportant value
- hash: f3814d5b43a4d67d7636ec64be828d82a92eedbb
id: '789012'
name: bcd
other_key: unimportant value

my_dict3:
abc: '123456'
bcd: '789012'

my_list3:
- {id: '123456', name: abc}
- {id: '789012', name: bcd}

可选地,将 id 从字符串转换为数字

  my_dict3: "{{ dict(my_list2|groupby('hash')|
map('last')|
map('first')|
json_query('[].[name, to_number(id)]')) }}"
my_list3: "{{ my_dict3|dict2items(key_name='name', value_name='id') }}"

给予

  my_dict3:
abc: 123456
bcd: 789012

my_list3:
- {id: 123456, name: abc}
- {id: 789012, name: bcd}

<支持>

完整的测试手册示例

- hosts: localhost

vars:

my_list:
- {id: '123456', name: abc, other_key: unimportant value}
- {id: '123456', name: abc, other_key: another unimportant value}
- {id: '789012', name: bcd, other_key: unimportant value}

my_hash: "{{ my_list|json_query('[].[name, id]')|
map('join')|
map('hash')|
map('community.general.dict_kv', 'hash') }}"
my_list2: "{{ my_list|zip(my_hash)|map('combine') }}"
my_dict3: "{{ dict(my_list2|groupby('hash')|
map('last')|
map('first')|
json_query('[].[name, to_number(id)]')) }}"
# json_query('[].[name, id]')) }}"
my_list3: "{{ my_dict3|dict2items(key_name='name', value_name='id') }}"

tasks:

- debug:
var: my_list|to_yaml
- debug:
var: my_hash|to_yaml
- debug:
var: my_list2
- debug:
var: my_dict3
- debug:
var: my_list3|to_yaml

起源。

鉴于数据存储在变量 my_list 中,让我们添加 hash 属性,该属性由 nameid< 创建 属性,添加到列表中。例如,

    - set_fact:
my_list2: "{{ my_list2|default([]) +
[item|combine({'hash': (item.name ~ item.id)|hash})] }}"
loop: "{{ my_list }}"
- debug:
var: my_list2

给予

  my_list2:
- hash: 370194ff6e0f93a7432e16cc9badd9427e8b4e13
id: '123456'
name: abc
other_key: unimportant value
- hash: 370194ff6e0f93a7432e16cc9badd9427e8b4e13
id: '123456'
name: abc
other_key: another unimportant value
- hash: f3814d5b43a4d67d7636ec64be828d82a92eedbb
id: '789012'
name: bcd
other_key: unimportant value

随后使用 groupby 过滤器并选择所需的属性。例如,

    - set_fact:
my_list3: "{{ my_list3|default([]) +
[{'name': item.1.0.name, 'id': item.1.0.id}] }}"
loop: "{{ my_list2|groupby('hash') }}"
- debug:
var: my_list3

给予

  my_list3:
- {id: '123456', name: abc}
- {id: '789012', name: bcd}

<支持>

完整的测试手册示例

- hosts: localhost

vars:

my_list:
- {id: '123456', name: abc, other_key: unimportant value}
- {id: '123456', name: abc, other_key: another unimportant value}
- {id: '789012', name: bcd, other_key: unimportant value}

tasks:

- set_fact:
my_list2: "{{ my_list2|default([]) +
[item|combine({'hash': (item.name ~ item.id)|hash})] }}"
loop: "{{ my_list }}"
- debug:
var: my_list2

- set_fact:
my_list3: "{{ my_list3|default([]) +
[{'name': item.1.0.name, 'id': item.1.0.id}] }}"
loop: "{{ my_list2|groupby('hash') }}"
- debug:
var: my_list3|to_yaml

关于filter - Ansible 过滤字典列表以仅在一个字段中包含唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60476887/

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