Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将展开字典的元素分组到子列表中_Python_List_Dictionary - Fatal编程技术网

Python 将展开字典的元素分组到子列表中

Python 将展开字典的元素分组到子列表中,python,list,dictionary,Python,List,Dictionary,我有一个扁平化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', '

我有一个扁平化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'

}]
基本思想是分组后,我可以将每个列表加载到一个平面文件中

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

  • 取下每个键并检查
    ,对它们进行排序,然后取结果。这种方法有很多问题
  • 尝试使用
    defaultdict
    ,但我甚至无法远程访问此功能
    有没有更好的办法

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

    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
    
    这两个函数将
    设置
    使用键列表从列表中获取
    项, 访问了解更多关于这两个方面的信息。
    然后执行以下代码以获得所需的输出:

    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\u 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'
       }
      ]
    }
    

    person\u address
    person
    是您预期的响应吗?我认为您希望部分取消展平此展平数据。您是只提取单个人员的数据,还是在您的真实数据中还存在
    persons\u 1
    persons\u 2
    等数据?@PM2Ring yes您是对的。很抱歉先前评论中的含糊不清。我正在为多人提取。@PM2Ring:如何部分取消每个级别的dict,获取每个级别的关键点如果您能向我们展示一些更真实的输入,包括多人,以及与该输入匹配的预期输出,那将非常有帮助。数据不需要包含所有的键,只需足够明确地传递正确的结构即可。然后,为你的问题编写代码的任何人都可以测试他们的代码。这正是我开始使用的嵌套字典。现在我需要合并展平字典的值以获得所需的结果。文中提到了期望的结果above@Shash“预期结果如上所述”。你的描述太模糊了。您需要向我们展示预期的输出。