Фильтровать словарь на основе ключа

#ansible

#ansible

Вопрос:

У меня есть такой диктант

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

Как отфильтровать этот dict на основе ключа?

Ответ №1:

Для этого существуют специальные фильтры jinja2: selectattr и rejectattr .

Но они работают со списком dicts, а не с самим dict. Вам придется использовать dict2items и items2dict обойти это.

Вот несколько примеров использования:

 # 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 }}"
  

Проверьте вышеупомянутую документацию и остальные фильтры для исчерпывающего представления всех возможностей.

Ответ №2:

вы могли бы использовать dict2items для переформатирования элементов, чтобы иметь имена, которые вы ищете в качестве ключей, а затем передать их в map filter, чтобы получить эти ключи:

 ---
- 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 }}'
  

приветствия