【问题标题】:Merging nested dictionary comparing nested values合并嵌套字典比较嵌套值
【发布时间】:2019-09-26 17:35:07
【问题描述】:

我正在尝试合并两个嵌套字典,它们将通过比较值来合并不同的字典,如果键相同,它将被替换为最近的值。

我使用 always_merger.merge() 进行合并,但附加了不同的元素。它应该用最近的值比较和替换值。

dictionary_1 = dict([('modifyParameterReq', {
  'managedObject': {
    'distName': 'ethLink_1',
    'operation': 'create_mo',
    'parameter': [

    {
      'parameterName': 'houseName',
      'newValue': 'Bhawan',
      'prevValue': ''
    },
    {
      'parameterName': 'subscribe',
      'newValue': 'TRUE',
      'prevValue': ''
    },

    {
      'parameterName': 'remoteMacAddress',
      'newValue': 'd6-68-05-5e-06-b9',
      'prevValue': ''
    }

    ],
    'class': 'EthernetLink'
  }
})]
)

dictionary_2 = dict([('modifyParameterReq', {
  'managedObject': {
    'distName': 'ethLink_1',
    'operation': 'create_mo',
    'parameter': [

    {
      'parameterName': 'subscribe',
      'newValue': 'FALSE',
      'prevValue': ''
    },
    {
      'parameterName': 'remoteMacAddress',
      'newValue': 'a1-b1-c3-d4-e5-f6',
      'prevValue': ''
    },
    {
      'parameterName': 'yourName',
      'newValue': 'Vicky',
      'prevValue': ''
    }

    ],
    'class': 'EthernetLink'
  }
})
]
)

如果该元素不存在,则添加该元素,否则用新值替换。 任何帮助都应该感激。

【问题讨论】:

    标签: python dictionary merge


    【解决方案1】:

    应该这样做。我在两者之间写了一些 cmets 以使其更具可读性:

    # Get all current parameter names from dictionary 1.
    currentDictParameterNames = [elem['parameterName'] for elem in dictionary_1['modifyParameterReq']['managedObject']['parameter']]
    
    # Iterate through parameters from dictionary 2.
    for index, dictData in enumerate(dictionary_2['modifyParameterReq']['managedObject']['parameter']):
        # If current key iterated from dictionary 2 exists in dictionary 1, update.
        if dictData['parameterName'] in currentDictParameterNames:
            # FInd the location of the parameter name in dictionary 1 and update.
            for i in range(len(dictionary_1['modifyParameterReq']['managedObject']['parameter'])):
                if dictionary_1['modifyParameterReq']['managedObject']['parameter'][i]['parameterName'] == dictData['parameterName']:
                    dictionary_1['modifyParameterReq']['managedObject']['parameter'][i]['prevValue'] = dictionary_1['modifyParameterReq']['managedObject']['parameter'][i]['newValue']
                    dictionary_1['modifyParameterReq']['managedObject']['parameter'][i]['newValue'] = dictData['newValue']
                    break
        # Else create a new record.
        else:
            dictionary_1['modifyParameterReq']['managedObject']['parameter'].append(dictData)
    
    print(dictionary_1)
    

    结果应该是:

    {'modifyParameterReq': {'managedObject': {
        'distName': 'ethLink_1',
        'operation': 'create_mo',
        'parameter': [
             {'parameterName': 'houseName', 'newValue': 'Bhawan', 'prevValue': ''},
             {'parameterName': 'subscribe', 'newValue': 'FALSE', 'prevValue': 'TRUE'},
             {'parameterName': 'remoteMacAddress', 'newValue': 'a1-b1-c3-d4-e5-f6', 'prevValue': 'd6-68-05-5e-06-b9'},
             {'parameterName': 'yourName', 'newValue': 'Vicky', 'prevValue': ''}],
        'class': 'EthernetLink',
        }}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      相关资源
      最近更新 更多