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'
}]
基本思想是分组后我可以将每个列表加载到一个平面文件中。
到目前为止我所做的一切:
- 获取每个键并检查
_
,对它们进行排序并获取结果。这种方法有很多问题。 - 尝试使用
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
这两个功能将使用键列表set
和get
列表中的一个项目,请访问此处以了解有关这两个的更多信息。
然后执行下面的代码以获得您想要的输出:
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'
}
]
}
推荐阅读
- javascript - jQuery:在每个单词的最后一个单词之前插入“”
- r - R中的字符串到表
- firebase - Firebase ID 问题
- r - “标记”ggplot2中的刻度线?
- python - 将日期时间对象插入 BigQuery 时,Google Cloud 函数崩溃
- ruby-on-rails - 如何建立这种多态关系?
- c++ - 使用宏来摆脱依赖的模板关键字是个好主意吗?
- python - 无法从 xpath 获取价值
- python - Git 最佳实践:如何构建一个大型应用程序所需的多个 python 模块
- function - 使用功能 swiftUI 将视图添加到 contentView 不起作用