Замена всех ключей по условию
Тренировочная задача, нужно заменить все ключи объекта на lowercase/uppercase (в зависимости от передаваемого параметра), получается заменить только "внешние" ключи, внутренние никак не получается, не могу понять как передать вложенные объекты на новую интерацию, так же вопрос по-поводу типа, изначально я передаю dict, в функции меняю его на list, но обратно нужно вернуть dict, т.е. нужно вернуть тот тип объекта, который пришёл, не могу понять как это сделать красиво, но без лишней жести, чтобы всё было понятно
obj = {
'key1': 1,
'key2': 2,
'key3': {
'key4': {
'key5': [
{
'key6': 3,
'key7': {
'key8': 4
}
}
]
}
}
}
def set_case(value, case):
if (case == 'lowercase'):
return value.lower()
else:
return value.upper()
def rec_keys(node, case = 'uppercase'):
output = [{}]
if isinstance(node, dict):
node = [node]
for index in range(len(node)):
for key in node[index]:
if isinstance(node[index][key], dict):
output[index].update({ set_case(key, case): node[index][key] })
else:
output[index].update({ set_case(key, case): node[index][key] })
if isinstance(node[index][key], list):
print()
return output
print(rec_keys(obj))
Ответы (1 шт):
Автор решения: n1tr0xs
→ Ссылка
Можно так сделать:
def set_case(obj, case):
new_obj={}
for key in obj.keys():
# меняем регистр
if case=='lowercase':
new_key=key.lower()
elif case=='uppercase':
new_key=key.upper()
else: # если вдруг ввели что-то не то
new_key=key
# если тип значения по ключу словарь, то вызываем саму себя
if type(obj[key])==dict:
new_obj[new_key] = set_case(obj[key], case)
# иначе просто присваиваем
else:
new_obj[new_key] = obj[key]
return new_obj
obj={
'KEY1':'val1',
'KEY2': {
'KEY2.1': 'val2',
'keY2.2': 'val3'
},
'kEy4': 'val88'
}
print(set_case(obj, 'lowercase'))