Как извлечь ключ из словаря и сделать его первичным ключом

#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 добавленное изменение может сработать для вас, я думаю, с помощью собственного метода