将展开字典的元素分组为子元素

2024-03-28 16:41:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个扁平的json(使用扁平json库扁平化)。我现在要把他们分组

{   'persons_0_address_building': '710',
    'persons_0_address_coord': '[123, 40]',
    'persons_0_address_street': 'Avenue 1',
    'persons_0_address_zipcode': '12345',
    'persons_0_cuisine': 'Chinese',
    'persons_0_grades_0_date': '2014-03-03T00:00:00.000Z',
    'persons_0_grades_0_grade': 'A',
    'persons_0_grades_0_score_x': 1,
    'persons_0_grades_0_score_y': 2,
    'persons_0_grades_1_date': '2011-11-23T00:00:00.000Z',
    'persons_0_grades_1_grade': 'A',
    'persons_0_grades_1_score_x': 11,
    'persons_0_grades_1_score_y': 22,
    'persons_0_id': '4d322fa8f552',
    'persons_0_name': 'Shash'

}

预期结果如下。你知道吗

person_address = 
[
   {
    'building': '710',
    'coord': '[123, 40]',
    'street': 'Avenue 1',
    'zipcode': '12345',
    'id': '4d322fa8f552'
   }
]
person = 

[{
    'cuisine': 'Chinese',
    'id': '4d322fa8f552',
    'name': 'Shash'

}]

基本思想是分组后,我可以将每个列表加载到一个平面文件中。你知道吗

到目前为止我所做的一切:

  1. 获取每个键并检查_,对它们进行排序,然后获取结果。这种方法有很多问题。你知道吗
  2. 我尝试过使用defaultdict,但我甚至无法远程访问。你知道吗

有没有更好的办法。你知道吗


Tags: idjsonstreetdateaddressscoregradeszipcode
1条回答
网友
1楼 · 发布于 2024-03-28 16:41:55

我想我找到你要找的了。
首先,您应该定义这两个函数:

from functools import reduce
import operator


def get_from_dict(data_dict, map_list):
    return reduce(operator.getitem, map_list, data_dict)

def set_in_dict(data_dict, map_list, value):
    get_from_dict(data_dict, map_list[:-1])[map_list[-1]] = value

这两个函数将setget使用键列表从列表中选择一个项, 访问here了解有关这两个方面的更多信息。
然后执行以下代码以获得所需的输出:

final_dict = {}

for key, value in input_.items():
    keys_array = []
    for i in key.split('_'):
        try:
            index = int(i)
        except ValueError:
            keys_array.append(i)
            try:
                get_from_dict(final_dict, keys_array)
            except KeyError:
                set_in_dict(final_dict, keys_array, {})
            except IndexError:
                set_in_dict(final_dict, keys_array[:-1], {})
        else:
            keys_array.append(index)
            try:
                get_from_dict(final_dict, keys_array)
            except IndexError:
                if len(get_from_dict(final_dict, keys_array[:-1])) > 0:
                    get_from_dict(final_dict, keys_array[:-1]).append({})
                else:
                    set_in_dict(final_dict, keys_array, [])
            except KeyError:
                set_in_dict(final_dict, keys_array[:-1], [{}])
    else:
        set_in_dict(final_dict, keys_array, value)

假设您的输入在input_中,而您想要的输出在final_dict中。

在您的示例中,输出如下所示:

{
  'persons': [
    {
      'address': 
        {
          'building': '710',
          'coord': '[123, 40]',
          'street': 'Avenue 1',
          'zipcode': '12345'
        },
      'cuisine': 'Chinese',
      'grades': [
        {
          'date': '2014-03-03T00:00:00.000Z',
          'grade': 'A',
          'score': {
            'x': 1,
            'y': 2
          }
        },
        {
          'date': '2011-11-23T00:00:00.000Z',
          'grade': 'A',
          'score': {
            'x': 11,
            'y': 22
          }
        }
      ],
     'id': '4d322fa8f552', 
     'name': 'Shash'
   }
  ]
}

相关问题 更多 >