TransWikia.com

преобразовать словарь в словарь с вложением

Stack Overflow на русском Asked by WilteRatenau on November 7, 2021

Не получается преобразовать словарь в словарь с вложением.

Из БД получаю:

[
  {
    'id': 1,
    'name': 'default',
    'sub_id': 20,
    'sub_name': 'default default'
  },
  {
    'id': 1,
    'name': 'default',
    'sub_id': 21,
    'sub_name': 'default default'
  },
  {
    'id': 1,
    'name': 'default',
    'sub_id': 22,
    'sub_name': 'default default'
  },
  {
    'id': 2,
    'name': 'default',
    'sub_id': 30,
    'sub_name': 'default default'
  },
  {
    'id': 2,
    'name': 'default',
    'sub_id': 31,
    'sub_name': 'default default'
  },
  {
    'id': 2,
    'name': 'default',
    'sub_id': 32,
    'sub_name': 'default default'
  }
]

А необходимо сделать вложение и объеденить по id. Результат должен быть таким:

{
  {
    'id': 1,
    'name': 'default',
    'sub_elem': [
      {
        'sub_id': 20,
        'sub_name': 'default default'
      },
      {
        'sub_id': 21,
        'sub_name': 'default default'
      },
      {
        'sub_id': 22,
        'sub_name': 'default default'
      }
    ]
  },
  {
    'id': 2,
    'name': 'default',
    'sub_elem': [
      {
        'sub_id': 30,
        'sub_name': 'default default'
      },
      {
        'sub_id': 31,
        'sub_name': 'default default'
      },
      {
        'sub_id': 32,
        'sub_name': 'default default'
      }
    ]
}

2 Answers

Можно вручную пройтись по списку словарей и составить новый.

Пример:

data = ...

new_data = dict()
for x in data:
    id_ = x['id']
    if id_ not in new_data:
        new_data[id_] = {
            'id': id_,
            'name': x['name'],
            'sub_elem': []
        }

    sub_elem = new_data[id_]['sub_elem']
    sub_elem.append({
        'sub_id': x['sub_id'],
        'sub_name': x['sub_name'],
    })

result = list(new_data.values())
print(result)
# [{'id': 1, 'name': 'default', 'sub_elem': [{'sub_id': 20, ...

Answered by gil9red on November 7, 2021

воспользуйтесь Pandas:

df = pd.DataFrame(data)
res = (df
       .groupby(["id", "name"])
       [["sub_id", "sub_name"]]
       .apply(lambda x: x.to_dict("r"))
       .reset_index(name="sub_elem")
       .to_dict("r"))

результат:

In [16]: res
Out[16]:
[{'id': 1,
  'name': 'default',
  'sub_elem': [{'sub_id': 20, 'sub_name': 'default default'},
   {'sub_id': 21, 'sub_name': 'default default'},
   {'sub_id': 22, 'sub_name': 'default default'}]},
 {'id': 2,
  'name': 'default',
  'sub_elem': [{'sub_id': 30, 'sub_name': 'default default'},
   {'sub_id': 31, 'sub_name': 'default default'},
   {'sub_id': 32, 'sub_name': 'default default'}]}]

Answered by MaxU on November 7, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP