根据关键字过滤字典

时间:2020-10-21 07:15:18

标签: ansible

我有这样的字典

{"product_1": [
        "account1",
        "account2"
    ],
"product_2": [
        "account1",
        "account2"
    ],
...
"product_10": [
        "account1",
        "account2"
    ]}

如何根据键过滤此字典?

2 个答案:

答案 0 :(得分:1)

您可以使用dict2items重新设置元素的格式,以将要搜索的名称作为关键字,然后将其传递到map过滤器以获取这些关键字:

---
- hosts: localhost
  gather_facts: false
  vars:
    myvar: 
      product_1:
      - account1
      - account2
      product_2:
      - account1
      - account2
      product_10:
      - account1
      - account2

    
  tasks:
  - name: extract the list of keys
    debug:
      msg: '{{ myvar | dict2items | map(attribute="key") | list }}'

欢呼

答案 1 :(得分:1)

有专门的jinja2过滤器:selectattrrejectattr

但是这些仅适用于词典列表,而不适用于词典本身。您将不得不使用dict2itemsitems2dict来解决此问题。

以下是一些用法示例:

# Values are dicts, select only items with specific attribute defined.
result: "{{ my_dict | dict2items | selectattr('value.my_attribute', 'defined')
  | list | items2dict }}"

# Values are lists (as in your example), check for an existing item value.
result: "{{ my_dict | dict2items | selectattr('value', 'contains', 'some item')
  | list | items2dict }}"

# Values are dict. Reject elements when attributes has a specific value.
result: "{{ my_dict | dict2items | rejectattr('value.my_attribute', '==', 'Does not apply')
  | list | items2dict }}"

查看上述文档和filters的其余部分,以详尽了解所有可能性。