Форум сайта python.su
Создала пустой словарь в который добавляю ключ-значения из цикла for, необходимо сохранить все из цикла.
Подскажите пожалуйста, может поставить условие на существование ключа в словаре и придумать автоматическое генерирование названия нового ключа, если ключ уже существует в словаре.
Например у меня подается на входе:
'name': ‘NSU’
'Location': ‘Novosibirsk’
'name': ‘Alexander Ivanov’
'Aim': ‘Student’
'name': ‘MMF’
Хочу на выходе получить словарь:
{'name': ‘NSU’,'Location': ‘Novosibirsk’, ‘name_1’: ‘Alexander Ivanov’, ‘Aim’: ‘Student’, ‘name_2’: ‘MMF’}
У меня на входе список элементы которого словари. Я каждый элемент списка (словарь с вложенными словарями) преобразую как раз до простого словаря (нахожу конечные ключ-значения с помощью рекурсии), в процессе раскрытия словарей у меня и появляются одинаковые ключи. На выходе хотела бы получить список состоящий из простых словарей с сохраненнием всех ключей и преобразовать список словарей до DF. Проблема словаря - в том,что если у меня 3 раза например появляется ключ name - сохраняется лишь последнее значение, но я бы хотела получить три разные ключа.
Вот мой код, который преобразует вложенный словарь до простого, но не учитывает трансформацию ключа, если данный ключ уже есть:
def dict_traversal(d, a=defaultdict(list)):
“”“
dict_traversal is recurse method over nested dictionaries and return key-value as a dictionary
:param d: nested dictionary
:param a: new dictionary for saving the results
:return: dictionary without attachments
”“”
for key, value in d.items():
if isinstance(value, dict):
dict_traversal(value)
elif isinstance(value, list):
for el in value:
if isinstance(el,dict):
dict_traversal(el)
else:
if key not in ('url', ‘type’,'done','totalSize'):
a.append(value)
return a.copy()
Буду очень благодарна любой помощи)
Офлайн
Nagibajupython69конечно. в словаре не может быть одинаковых ключей.
автоматическое генерирование названия нового ключа, если ключ уже существует в словаре.
number = 1 dct = {} val = 'test' for key in ('name', 'name', 'Aim', 'name'): if key in dct: key = f'{key}_{number}' number += 1 dct.setdefault(key, val) print(dct)
Офлайн
Nagibajupython69я бы задумался,на сколько удобна такая структура данных,на сколько удобно ей будет пользоваться при больших объемах.А так это похоже на выборку из таблиц базы данных,которую надо отправить куда-то одним запросом.ТОгда ключем я бы использовал название таблицы,а значением словарь из названия столбцов и их значения.К примеру
Хочу на выходе получить словарь:
{'name': ‘NSU’,'Location': ‘Novosibirsk’, ‘name_1’: ‘Alexander Ivanov’, ‘Aim’: ‘Student’, ‘name_2’: ‘MMF’}
d= { 'table_name_1': { 'name': 'NSU', 'Location': 'Novosibirsk' }, 'table_name_2': { 'name': 'Alexandr Ivanov', 'Aim': 'Student', }, 'table_name_3': { 'name': "MMF" } } for i in d.keys(): print(d[i]['name'])
NSU Alexandr Ivanov MMF Process finished with exit code 0
Отредактировано xam1816 (Март 2, 2021 21:57:17)
Онлайн