Слияние вложенного словаря, сравнение вложенных значений - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь объединить два вложенных словаря, которые будут объединять разные словари, сравнивая значения. Если ключ будет одинаковым, он будет заменен на последнее значение.

Я использую 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'
  }
})
]
)

, если элемент отсутствует, добавить элемент, заменив его новым значением.Любая помощь должна быть оценена.

1 Ответ

0 голосов
/ 26 сентября 2019

Это должно сделать это.Я написал несколько комментариев между ними, чтобы сделать его более читабельным:

# 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',
    }}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...