Извлечь значение по ключу из двух вложенных словарей
У меня есть два json файла.
В первом структура имеет следующий вид:
{
"44665" : {
"id" : 44665,
"name" : "Type1",
"type" : "DOUBLE",
"scanClass" : "default",
"instrumentTag" : "2049",
"exceptionMin" : 0,
"exceptionMax" : 30000000000,
"exceptionDeviation" : 0.001,
"isCompressed" : true,
"additionalAttributes" : { }
},
"44666" : {
"id" : 44666,
"name" : "Type2",
"type" : "DOUBLE",
"scanClass" : "default",
"instrumentTag" : "2050",
"exceptionMin" : 0,
"exceptionMax" : 30000000000,
"exceptionDeviation" : 0.001,
"isCompressed" : true,
"additionalAttributes" : { }
},
"44671" : {
"id" : 44671,
"name" : "Type3",
"type" : "DOUBLE",
"scanClass" : "default",
"instrumentTag" : "2013",
"exceptionMin" : 0,
"exceptionMax" : 30000000000,
"exceptionDeviation" : 0.001,
"isCompressed" : true,
"additionalAttributes" : { }
}
}
Второй выглядит вот так:
{
"result" : {
"45073" : {
"timestamp" : 1616582519552000000,
"addedTimestamp" : 1616582533238762700,
"valueDbl" : 70.22978,
"valueLong" : null,
"valueFloat" : null,
"valueStr" : null,
"valueBool" : null,
"replaced" : null,
"annotation" : null,
"quality" : 0
},
"45074" : {
"timestamp" : 1616582519552000000,
"addedTimestamp" : 1616582533238772500,
"valueDbl" : 60.27541,
"valueLong" : null,
"valueFloat" : null,
"valueStr" : null,
"valueBool" : null,
"replaced" : null,
"annotation" : null,
"quality" : 0
},
"44664" : {
"timestamp" : 1616582519553000000,
"addedTimestamp" : 1616582533536364600,
"valueDbl" : 42.36111,
"valueLong" : null,
"valueFloat" : null,
"valueStr" : null,
"valueBool" : null,
"replaced" : null,
"annotation" : null,
"quality" : 0
}
}
}
Достаю из файлов следующим образом:
with open ('data2.json', 'r', encoding='utf-8') as f:
with open('data3.json', 'r', encoding='utf-8') as f1:
text2 = json.loads(f1.read())
text = json.loads(f.read())
Как извлечь несколько пар ключ-значение из данных словарей и записать в результирующий список, который должен иметь следующий вид
[
{
"id" : 44665,
"name" : "Type1",
"valueDbl" : 70.22978,
}, {
"id" : 44666,
"name" : "Type2",
"valueDbl" : 60.27541,
}, {
"id" : 44671,
"name" : "Type3",
"valueDbl" : 42.36111,
}
]
Ответы (1 шт):
Автор решения: Jack_oS
→ Ссылка
Прочитать файлы можно в одном контексте:
import json
with open('data2.json', encoding='utf-8') as d2, open('data3.json', encoding='utf-8') as d3:
data2 = json.loads(d2.read())
data3 = json.loads(d3.read())['result']
и сформировать новый список словарей:
result = []
for k, v in data2.items():
result.append({
'id': k,
'name': v['name'],
'valueDbl': data3[k]['valueDbl'] if data3.get(k) else None
})
в котором будут id из data2 или None для valueDbl при несовпадении,
[
{'id': '44665', 'name': 'Type1', 'valueDbl': 70.22978},
{'id': '44666', 'name': 'Type2', 'valueDbl': None},
{'id': '44671', 'name': 'Type3', 'valueDbl': 42.36111}
]
PS исходные данные изменены, чтоб было два совпадения:
data2 = {'44665': {'id': 44665, 'name': 'Type1', 'type': 'DOUBLE', 'scanClass': 'default', 'instrumentTag': '2049', 'exceptionMin': 0, 'exceptionMax': 30000000000, 'exceptionDeviation': 0.001, 'isCompressed': True, 'additionalAttributes': {}}, '44666': {'id': 44666, 'name': 'Type2', 'type': 'DOUBLE', 'scanClass': 'default', 'instrumentTag': '2050', 'exceptionMin': 0, 'exceptionMax': 30000000000, 'exceptionDeviation': 0.001, 'isCompressed': True, 'additionalAttributes': {}}, '44671': {'id': 44671, 'name': 'Type3', 'type': 'DOUBLE', 'scanClass': 'default', 'instrumentTag': '2013', 'exceptionMin': 0, 'exceptionMax': 30000000000, 'exceptionDeviation': 0.001, 'isCompressed': True, 'additionalAttributes': {}}}
data3 = {'44665': {'timestamp': 1616582519552000000, 'addedTimestamp': 1616582533238762700, 'valueDbl': 70.22978, 'valueLong': None, 'valueFloat': None, 'valueStr': None, 'valueBool': None, 'replaced': None, 'annotation': None, 'quality': 0}, '45074': {'timestamp': 1616582519552000000, 'addedTimestamp': 1616582533238772500, 'valueDbl': 60.27541, 'valueLong': None, 'valueFloat': None, 'valueStr': None, 'valueBool': None, 'replaced': None, 'annotation': None, 'quality': 0}, '44671': {'timestamp': 1616582519553000000, 'addedTimestamp': 1616582533536364600, 'valueDbl': 42.36111, 'valueLong': None, 'valueFloat': None, 'valueStr': None, 'valueBool': None, 'replaced': None, 'annotation': None, 'quality': 0}}