首页 > 解决方案 > Ansible - 如何比较具有相同键的两个字典

问题描述

我有两个字典:

source_list:
  myFlag1: true
  MyFlag2: false

第二个字典:

target_list:
  MyFlag1: false
  MyFlag2: false

键总是相同的,但顺序并不严格。我如何突出它们之间的区别?我可以使用 dict2items 将列表转换为

source_list:
  - key: MyFlag1
    value: true
  - key: MyFlag2
    value: false

但是我又很困惑,我该如何比较它们......当然,我可以遍历两个字典并一一比较,但它看起来并不真正有效。任何帮助将不胜感激!

标签: dictionaryansiblecompare

解决方案


问:如何比较具有相同键的两个字典?

A: 简单的比较一下变量,简单的看一下有没有区别,比如

    - debug:
        msg: The dictionaries are identical
      when: source_list == target_list

要查找不同的值,请迭代字典的键列表并逐项比较字典,例如

      vars:
        source_list:
          MyFlag1: true
          myFlag3: true
          MyFlag2: false
        target_list:
          myFlag3: true
          MyFlag1: false
          MyFlag2: false
    
      tasks:
        - debug:
            msg: "{{ item }} is {{ (source_list[item] == target_list[item])|
                                   ternary('OK', 'KO') }}"
          loop: "{{ source_list.keys()|sort }}"

    msg: MyFlag1 is KO
    msg: MyFlag2 is OK
    msg: myFlag3 is OK

出于调试目的,可以先比较密钥,例如

    - debug:
        msg: "The difference in the keys: {{ diff_keys }}"
      vars:
        skeys: "{{ source_list.keys()|list }}"
        tkeys: "{{ target_list.keys()|list }}"
        diff_keys: "{{ skeys|symmetric_difference(tkeys) }}"
      when:  diff_keys|length != 0

问:我怎样才能突出它们之间的区别?

A:创建一个仅包含不同项目的字典,例如

    - set_fact:
        diff_list: {}
    - set_fact:
        diff_list: "{{ diff_list|combine({item: source_list[item]}) }}"
      loop: "{{ source_list.keys()|list }}"
      when: source_list[item] != target_list[item]

  diff_list:
    MyFlag1: true

推荐阅读