#python
Вопрос:
Мой адрес находится ниже
{ 'Owner': [ { 'id': '1', 'name': 'John', 'contactEmail': 'john@nif.com', 'role': 'Owner' }, { 'id': '2', 'contactName': 'Work', 'contactEmail': 'work@nif.com', 'role': 'Owner' } ], 'Manager': [ { 'id': '1', 'name': 'John', 'contactEmail': 'john@nif.com', 'role': 'Manager' } ] }
- Извлечь
id
наружу - Добавьте весь словарь в новый ключ под названием
'employee'
- Для одной и той же ключевой роли существуют два разных ключа, объединенных в один
- id=1 роль присутствует как Владелец и Менеджер, вывод будет
role:['Manager', 'Owner']
Ожидается
{ 'employee': { '1': { 'email': 'john@nif.com', 'name': 'John', 'role': [ 'Owner', 'Manager' ] }, '2': { 'email': 'work@nif.com', 'name': 'Work', 'role': [ 'Owner' ] } } }
emp = {}
for key,val in event.items():
for each in val:
# [{'employee': key, **val} for key, val in event.items()] if event else []
emp['employee'] = each['id']
emp['name'] = each['name']
использование собственного метода python
Ответ №1:
Вот попытка без использования сторонних библиотек:
myd = {
'Owner': [
{ 'id': '1', 'name': 'John', 'contactEmail': 'john@nif.com', 'role': 'Owner' },
{ 'id': '2', 'contactName': 'Work', 'contactEmail': 'work@nif.com', 'role': 'Owner' }
],
'Manager': [ { 'id': '1', 'name': 'John', 'contactEmail': 'john@nif.com', 'role': 'Manager' } ]
}
empl_dict = {}
for employees in myd.values():
for emp in employees:
emp_id = emp.pop('id')
emp_role = emp.pop('role')
empl_dict[emp_id] = empl_dict.get(emp_id, {})
empl_dict[emp_id].update(emp)
empl_dict[emp_id]['role'] = empl_dict[emp_id].get('role', [])
empl_dict[emp_id]['role'].append(emp_role)
all_employees = {'employee': empl_dict}
print(all_employees)
результаты в:
{'employee': {'1': {'name': 'John', 'contactEmail': 'john@nif.com', 'role': ['Owner', 'Manager']}, '2': {'contactName': 'Work', 'contactEmail': 'work@nif.com', 'role': ['Owner']}}}
Ответ №2:
Вы можете использовать панд для достижения этой цели
Преобразование в фрейм данных pandas с последующим группированием по контактной почте и агрегированием результатов требуемым образом
df = pd.concat([pd.DataFrame(v).assign(key=k) for k,v in a.items()])
res = df.groupby('contactEmail').agg({'role':list,'name':'first'}).reset_index().T.to_dict()
{'employee':res}
из:
{'employee': {0: {'contactEmail': 'john@nif.com',
'role': ['Owner', 'Manager'],
'name': 'John'},
1: {'contactEmail': 'work@nif.com', 'role': ['Owner'], 'name': nan}}}
Редактировать:
если вы хотите добиться этого на python
for OM in a.keys():
for ids in a[OM]:
ids['role'] = [OM]
total_recs = sum(list(a.values()),[])
res = {}
for rec in total_recs:
ID = rec['id']
if ID not in res.keys():
rec.pop('id')
res[ID] = rec
else:
rec.pop('id')
res[ID]['role'].extend(rec['role'])
{'employee':res}
Из:
{'employee': {'1': {'name': 'John',
'contactEmail': 'john@nif.com',
'role': ['Owner', 'Manager']},
'2': {'contactName': 'Work',
'contactEmail': 'work@nif.com',
'role': ['Owner']}}}
Комментарии:
1. я хочу использовать собственный метод python
2. @sim добавленное изменение может сработать для вас, я думаю, с помощью собственного метода