Python объединяет два списка словарей на основе совпадающего ключа

У меня есть следующие два набора данных, и я хочу объединить их очень специфическим образом:

Поток

stream = {
  "sdd": [{
    "eid": "e532fcdb-2f3f-4c51-9afb-996b8679a5da",
    "nid": "ebef3cb1-9053-4d1e-b409-b682236445b7",
    "nname": "client"
  }, {
    "eid": "901b51b1-851f-448e-b2cc-9730267f824b",
    "nid": "0b5d79b5-0d21-4186-b3db-8f4a9f2b25fb",
    "nname": "server"
  }]
}

Профиль

profile = [{
  "ackid": "5dfe5dd4-e863-4474-bdad-54231b925f12",
  "nid": "ebef3cb1-9053-4d1e-b409-b682236445b7",
  "name": "default",
  "resources": {
    "cpu": {
      "min_cores": "2",
      "max_cores": "8"
    },
    "memory": {
      "min": "2000",
      "max": "10000"
    },
    "storage": {
      "min": "50",
      "max": "100"
    }
  }
}]

Что я хочу сделать, так это добавить в «поток» из «профиля» совпадающие (минимальные) значения из «ресурсов», где оба «nid» совпадают, чтобы получить что-то вроде этого:

Выход

{
  "sdd": [{
    "eid": "e532fcdb-2f3f-4c51-9afb-996b8679a5da",
    "nid": "ebef3cb1-9053-4d1e-b409-b682236445b7",
    "nname": "client",
    "cpu": "2",
    "mem": "2000",
    "storage":"50"
  }, {
    "eid": "901b51b1-851f-448e-b2cc-9730267f824b",
    "nid": "0b5d79b5-0d21-4186-b3db-8f4a9f2b25fb",
    "nname": "server"
  }]
}

Добро пожаловать в Stack Overflow! Возьмите тур, прочитайте что здесь по теме, Как спросить и контрольный список вопросов и предоставьте минимальный воспроизводимый пример. «Реализовать эту функцию для меня» не по теме для этого сайта, потому что SO не является бесплатной онлайн-службой кодирования. Вы должны сделать честную попытку, а затем спросить конкретный вопрос о вашем алгоритме или технике.

Pranav Hosangadi 16.05.2022 21:33
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
1
13
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пытаться:

tmp = {}
for p in profile:
    tmp[p["nid"]] = {
        "cpu": p["resources"]["cpu"]["min_cores"],
        "memory": p["resources"]["memory"]["min"],
        "storage": p["resources"]["storage"]["min"],
    }

out = {}
for k, v in stream.items():
    out[k] = [{**i, **tmp.get(i["nid"], {})} for i in v]


print(out)

Отпечатки:

{
    "sdd": [
        {
            "eid": "e532fcdb-2f3f-4c51-9afb-996b8679a5da",
            "nid": "ebef3cb1-9053-4d1e-b409-b682236445b7",
            "nname": "client",
            "cpu": "2",
            "memory": "2000",
            "storage": "50",
        },
        {
            "eid": "901b51b1-851f-448e-b2cc-9730267f824b",
            "nid": "0b5d79b5-0d21-4186-b3db-8f4a9f2b25fb",
            "nname": "server",
        },
    ]
}
Ответ принят как подходящий
def get_dict(x): 
    return {'min':x['memory']['min'], 'cpu':x['cpu']['min_cores'], 
        'storage':x['storage']['min']} 



Out = {'ssd':[i|get_dict(j['resources']) if i['nid']==j['nid'] else i for i in 
    stream['sdd'] for j in profile]}

Out: 
{'ssd': [{'eid': 'e532fcdb-2f3f-4c51-9afb-996b8679a5da',
   'nid': 'ebef3cb1-9053-4d1e-b409-b682236445b7',
   'nname': 'client',
   'min': '2000',
   'cpu': '2',
   'storage': '50'},
  {'eid': '901b51b1-851f-448e-b2cc-9730267f824b',
   'nid': '0b5d79b5-0d21-4186-b3db-8f4a9f2b25fb',
   'nname': 'server'}]}

Спасибо. Хорошее решение. Мне нравится бит get_dict(), который делает его более управляемым при изменении ресурсов.

Mark R 16.05.2022 21:57

Другие вопросы по теме