Заполнить словарь состоящий из списков, данными из другого словаря.

Jacob321

Новичок
Пользователь
Май 14, 2022
2
0
1
Всем привет, не жду решения, но не могу понять в какую сторону копать.

Имеем 2 Json файла:

JSON:
{
  "tests": [{
    "id": 2,
    "title": "Smoke test",
    "value": ""
  }, {
    "id": 41,
    "title": "Debug test",
    "value": ""
  }, {
    "id": 73,
    "title": "Performance test",
    "value": "",
    "values": [{
      "id": 345,
      "title": "Maxperf",
      "value": "",
      "values": [ {
        "id": 230,
        "title": "Percent",
        "values": [{
          "id": 234,
          "title": "200",
          "value": ""
        }, {
          "id": 653,
          "title": "300",
          "value": ""
        }]
      }]
    }, {
      "id": 110,
      "title": "Stability test",
      "value": "",
      "values": [ {
        "id": 261,
        "title": "Percent",
        "values": [{
          "id": 238,
          "title": "160",
          "value": ""
        }, {
          "id": 690,
          "title": "240",
          "value": ""
        }]
      }]
    }]
  }, {
    "id": 122,
    "title": "Security test",
    "value": "",
    "values": [{
      "id": 5321,
      "title": "Confidentiality",
      "value": ""
    }, {
      "id": 5322,
      "title": "Integrity",
      "value": ""
    }]
  }]
}

JSON:
{
  "values": [{
    "id": 2,
    "value": "passed"
  }, {
    "id": 41,
    "value": "passed"
  }, {
    "id": 73,
    "value": "passed"
  }, {
    "id": 110,
    "value": "failed"
  }, {
    "id": 122,
    "value": "failed"
  }, {
    "id": 234,
    "value": "passed"
  }, {
    "id": 238,
    "value": "passed"
  }, {
    "id": 345,
    "value": "passed"
  }, {
    "id": 653,
    "value": "passed"
  }, {
    "id": 690,
    "value": "failed"
  }, {
    "id": 5321,
    "value": "passed"
  }, {
    "id": 5322,
    "value": "failed"
  }]
}

На выходе необходимо получить JSON файл с заполненными ключами "value". По работе с JSON вопросов нет, получаем словарь json файла и дальше его преобразуем, не совсем понимаю как его заполнить, т.к в самом словаре вложены списки со словарями, в которых так же вложены списки со словарями, в общем матрешка, выглядит следующим образом:

Код:
{'tests': [{'id': 2, 'title': 'Smoke test', 'value': ''}, {'id': 41, 'title': 'Debug test', 'value': ''}, {'id': 73, 'title': 'Performance test', 'value': '', 'values': [{'id': 345, 'title': 'Maxperf', 'value': '', 'values': [{'id': 230, 'title': 'Percent', 'values': [{'id': 234, 'title': '200', 'value': ''}, {'id': 653, 'title': '300', 'value': ''}]}]}, {'id': 110, 'title': 'Stability test', 'value': '', 'values': [{'id': 261, 'title': 'Percent', 'values': [{'id': 238, 'title': '160', 'value': ''}, {'id': 690, 'title': '240', 'value': ''}]}]}]}, {'id': 122, 'title': 'Security test', 'value': '', 'values': [{'id': 5321, 'title': 'Confidentiality', 'value': ''}, {'id': 5322, 'title': 'Integrity', 'value': ''}]}]

На сколько я себе представляю алгоритм, нам необходимо взять значение ключа id из rsults.json, найти его в test.json и присвоить ключу "value" значение из results.

Тестовое задание уже завалил( Но очень хочу разобраться, как такое можно реализовать. Гугл, что то внятных ответов как это можно сделать не дает, возможно ищу не правильно.
 

rccp

Новичок
Пользователь
Май 12, 2022
13
2
3
ждва часа в юпитере):

json который нужно заполнить:

Код:
a = {
  "tests": [{
    "id": 2,
    "title": "Smoke test",
    "value": ""
  }, {
    "id": 41,
    "title": "Debug test",
    "value": ""
  }, {
    "id": 73,
    "title": "Performance test",
    "value": "",
    "values": [{
      "id": 345,
      "title": "Maxperf",
      "value": "",
      "values": [ {
        "id": 230,
        "title": "Percent",
        "values": [{
          "id": 234,
          "title": "200",
          "value": ""
        }, {
          "id": 653,
          "title": "300",
          "value": ""
        }]
      }]
    }, {
      "id": 110,
      "title": "Stability test",
      "value": "",
      "values": [ {
        "id": 261,
        "title": "Percent",
        "values": [{
          "id": 238,
          "title": "160",
          "value": ""
        }, {
          "id": 690,
          "title": "240",
          "value": ""
        }]
      }]
    }]
  }, {
    "id": 122,
    "title": "Security test",
    "value": "",
    "values": [{
      "id": 5321,
      "title": "Confidentiality",
      "value": ""
    }, {
      "id": 5322,
      "title": "Integrity",
      "value": ""
    }]
  }]
}

json откуда берем значения:
Код:
b = {
  "values": [{
    "id": 2,
    "value": "passed"
  }, {
    "id": 41,
    "value": "passed"
  }, {
    "id": 73,
    "value": "passed"
  }, {
    "id": 110,
    "value": "failed"
  }, {
    "id": 122,
    "value": "failed"
  }, {
    "id": 234,
    "value": "passed"
  }, {
    "id": 238,
    "value": "passed"
  }, {
    "id": 345,
    "value": "passed"
  }, {
    "id": 653,
    "value": "passed"
  }, {
    "id": 690,
    "value": "failed"
  }, {
    "id": 5321,
    "value": "passed"
  }, {
    "id": 5322,
    "value": "failed"
  }]
}

функция, которая все заполнит:

Python:
def fill_json(json1, json2):
    for i in json1:
        for v in json2['values']:
            if i.get('id') == v.get('id'):
                i['value'] = v.get('value')     
        if 'values' in i.keys():
            fill_json(i['values'], json2)


вызываем:
Код:
fill_json(a['tests'],b)

Тестовое задание уже завалил
Куда тестовое было, сколько зпч?)
 

Jacob321

Новичок
Пользователь
Май 14, 2022
2
0
1
функция, которая все заполнит:

Python:
def fill_json(json1, json2):
for i in json1:
for v in json2['values']:
if i.get('id') == v.get('id'):
i['value'] = v.get('value')
if 'values' in i.keys():
fill_json(i['values'], json2)
Гениально) я правильно понимаю, что этот метод можно считать рекурсией?), только наверное можно еще break добавить, что бы в холостую не гонял, получится как то так:

Python:
def fill_json(json1, json2):
    for i in json1:
        for v in json2['values']:
            if i.get('id') == v.get('id'):
                i['value'] = v.get('value')
                break
        if 'values' in i.keys():
            fill_json(i['values'], json2)

Куда тестовое было, сколько зпч?)
Стажировка в тестировнии) ЗП не знаю, я совсем начинающий, готов работать за опыт :geek:
 

Форум IT Специалистов