user3655103
user3655103

Reputation: 67

Remove items from list of dicts when item exist in another list of dicts

I have two list of dicts:

member_added: 
  pool1:
    - name: 10.99.99.101:80
    - name: 10.99.99.102:80
  pool2:
    - name: 10.98.98.101:80

member_updated:
  pool1:
    - name: 10.99.99.99:80
      status: present
    - name: 10.99.99.101:80
      status: present
    - name: 10.99.99.102:80
      status: present
  pool2:
    - name: 10.98.98.99:80
      status: present
    - name: 10.98.98.101:80
      status: present

I need to remove duplicate members from member_updated

End result should be

member_updated_without_duplicates:
  pool1:
    - name: 10.99.99.99:80
      status: present
  pool2:
    - name: 10.98.98.99:80
      status: present

I can imagine how to do it in Python, bus Ansible less flexible in data manipulation.

Does anybody have idea how remove those duplicates?

Upvotes: 1

Views: 69

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 67959

Given the data

    member_added: 
      pool1:
        - name: 10.99.99.101:80
        - name: 10.99.99.102:80
    member_updated:
      pool1:
        - name: 10.99.99.99:80
          status: present
        - name: 10.99.99.101:80
          status: present
        - name: 10.99.99.102:80
          status: present

The declarations

without: "{{ member_updated.pool1|
             rejectattr('name', 'in', member_added.pool1|
                                      map(attribute='name')|
                                      list) }}"
member_updated_without_duplicates: "{{{'pool1': without}}}"

give what you want

member_updated_without_duplicates:
  pool1:
    - name: 10.99.99.99:80
      status: present

Given the data

    member_added: 
      pool1:
        - name: 10.99.99.101:80
        - name: 10.99.99.102:80
    member_updated:
      pool1:
        - name: 10.99.99.99:80
          status: present
        - name: 10.99.99.101:80
          status: present
        - name: 10.99.99.102:80
          status: present
      pool2:
        - name: 10.99.99.98:80
          status: present
        - name: 10.99.99.101:80
          status: present

The declarations

blist: "{{ member_added.pool1|map(attribute='name')|list }}"
without: "{{ member_updated.values()|list|
             map('rejectattr', 'name', 'in', blist)|
             list }}"
member_updated_without_duplicates: "{{ dict(member_updated.keys()|zip(without)) }}"

give

member_updated_without_duplicates:
  pool1:
    - name: 10.99.99.99:80
      status: present
  pool2:
    - name: 10.99.99.98:80
      status: present

Upvotes: 2

Related Questions