我有一个列表字典,例如这里,尽管内部数据可以是任何复杂程度(也许是字符串,也许是字典,也许是多层嵌套的复杂对象)。
my_dict:
my_list_a:
- a
- b
- c
my_list_b:
- a
- d
- e
list_c:
- f
my_combined_list:
- a
- b
- c
- a
- d
- e
- f
不幸的是,由于 Jinja 缺乏支持,列表推导式无法实现,到目前为止我还无法拼凑出解决方案。
我还需要做一些额外的事情,尽管大多数事情在最终列表中都很容易完成(去重、排序等)。加入期间需要做的事情是:
select
或 reject
基于测试(例如,仅包含以字符串开头的列表:my_ 意味着 list_c 不会添加到最终结果中)我已经找到了许多用于字典列表或各种更复杂的特殊情况的方法,但我似乎找不到任何关于创建项目列表字典的所有内部项目的列表的信息。
问:将内部项目展平为列表。
A:最简单的选择是
my_combined_list: "{{ my_dict.values() | flatten }}"
给予
my_combined_list: [a, b, c, a, d, e, f]
问:根据测试选择或拒绝(起始字符串:my_,例如省略list_c)。
A:例如,使用测试match
allow_match: [my_]
my_combined_list: "{{ my_dict | dict2items |
selectattr('key', 'match', allow_match|join('|')) |
map(attribute='value') | flatten }}"
给予
my_combined_list: [a, b, c, a, d, e]
用于测试的完整剧本示例
- hosts: localhost
vars:
my_dict:
my_list_a: [a, b, c]
my_list_b: [a, d, e]
list_c: [f]
my_combined_list: "{{ my_dict.values() | flatten }}"
allow_match: [my_]
my_combined_lis2: "{{ my_dict | dict2items |
selectattr('key', 'match', allow_match|join('|')) |
map(attribute='value') | flatten }}"
tasks:
- debug:
var: my_combined_list | to_yaml
- debug:
var: my_combined_lis2 | to_yaml