Сохранение вложенных уровней словаря, включая базовый уровеньPython

Программы на Python
Anonymous
Сохранение вложенных уровней словаря, включая базовый уровень

Сообщение Anonymous »

Необходимо сохранить значения каждого уровня словаря, включая базовый уровень. Однако моя текущая реализация извлекает только значения следующего уровня (например, протоколов), а не самого базового уровня (например, common_props).
Как я могу изменить функции, чтобы они включали значения словарь базового уровня тоже? Фактические и ожидаемые результаты указаны вместе с программой.
Код:
data={
'common_props':
{
'max_number_of_event_entries': 20, 'memory_entry_storage_trigger': 'TEST-FAILED', 'aging_requires_tested_cycle': False, 'clear_dtc_limitation': 'ALL-SUPPORTED-DTCS', 'default_endianness': 'MOST-SIGNIFICANT-BYTE-FIRST'
},
'protocols':
{
'DoIP':
{
'short_name': 'DoIP', 'priority': '0x00', 'protocol_kind': 'DCM_UDS_ON_IP', 'diagnostic_connection': 'IP'
},

'DoCAN':
{
'short_name': 'DoCAN', 'priority': '0x01', 'protocol_kind': 'DCM_UDS_ON_CAN', 'diagnostic_connection': 'CAN'}
}
}

def dict_union(nested_dict_list: list):
result = {}
keys = collect_unique_keys(nested_dict_list)
for key in keys:
values = [d[key] for d in nested_dict_list if key in d]
if all(isinstance(value, dict) for value in values):
result[key] = dict_union(values)
else:
result[key] = None
return result

def collect_unique_keys(dict_list: list):
keys = []
for item in dict_list:
# print("item:", item)
if isinstance(item, dict): # Check if the item is a dictionary
for key in item:
# print("key:",key)
if key not in keys:
keys.append(key)
return keys

def flatten_nested_dict(dictionary, depth, level=0):
for key, value in dictionary.items():
if isinstance(value, dict):
if level == depth:
dictionary[key] = value

else:
flatten_nested_dict(value, depth, level+1)

level =1
depth = 3
# print("data:",data)
Testlist = []
for key, value in data.items():
# print("before flatten:",value)

if isinstance(value, dict):
if level == depth:
data[key] = value

else:
flatten_nested_dict(value, depth, level+1)
# print("after flatten:", value)

union = dict_union(value.values())
print(union)

Выходы:
union: Actual =
{}
{'short_name': None, 'priority': None, 'protocol_kind': None, 'diagnostic_connection': None}

union: Expected output=
{
'max_number_of_event_entries': None, 'memory_entry_storage_trigger': None, 'aging_requires_tested_cycle': None, 'clear_dtc_limitation': None, 'default_endianness': None}
}
{'short_name': None, 'priority': None, 'protocol_kind': None, 'diagnostic_connection': None}


Подробнее здесь: https://stackoverflow.com/questions/783 ... base-level

Вернуться в «Python»