Превращаем вложенный словарь в плоский. Неправильный вывод
Задача
Превращаем вложенный словарь в плоский
Перед вами имеется вложенный словарь, уровень вложенности произвольный и заранее неизвестен. Ключами словаря на любом уровне могут быть только строки, значения - только числа.
Учитывая указанные выше условия, ваша задача состоит в том, чтобы преобразовать этот вложенный словарь в плоский (состоящий только из одного уровня), где ключи формируются конкатенацией вложенных ключей, соединенных знаком: _
Для этого необходимо определить рекурсивную функцию flatten_dict
. Она должна принимать вложенный словарь и возвращать плоский
Ниже приведены несколько способов решения вышеуказанной задачи.
nested = {'Germany': {'berlin': 7},
'Europe': {'italy': {'Rome': 3}},
'USA': {'washington': 1, 'New York': 4}}
flatten_dict(nested) => {'Germany_berlin': 7,
'Europe_italy_Rome': 3,
'USA_washington': 1,
'USA_New York': 4}
nested = {'Q': {'w': {'E': {'r': {'T': {'y': 123}}}}}}
flatten_dict(nested) => {'Q_w_E_r_T_y': 123}
Мой код
def flatten_dict(user_dict: dict[any, any], total_dict: dict[any, any] = {}, x: [str] = [], y: [int] = []) -> dict:
for key, value in user_dict.items():
if type(value) == dict:
x.append(key)
flatten_dict(user_dict[key], total_dict, x, y)
else:
x.append(key)
y.append(value)
if type(value) != dict:
total_dict['_'.join(x)] = y[0]
x.clear()
y.clear()
return total_dict
Проблема
Код работает, но при наличии более, так скажем, одной цифры в ряду словарей, выводит неправильно. Пример:
ввожу:
flatten_dict({'Germany':7,'Europe': {'italy': {'Rome': 3}},'USA': {'washington': 1, 'New York': 4}}))
выводит:
{'Germany': 7, 'Europe_italy_Rome': 3, 'USA_washington': 1, 'New York': 4}