首页 > 解决方案 > 将扁平字典的元素分组到子列表中

问题描述

我有一个扁平化的 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,但我什至无法远程访问。

有没有更好的方法来解决这个问题。

标签: pythonlistdictionary

解决方案


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

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列表中的一个项目,请访问此处以了解有关这两个的更多信息。
然后执行下面的代码以获得您想要的输出:

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)

假设你的输入是 ininput_并且你想要的输出是 in 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'
   }
  ]
}

推荐阅读