Python 将展开字典的元素分组到子列表中
我有一个扁平化json(使用扁平化json库扁平化)。我现在必须把它们分组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', '
{ '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“预期结果如上所述”。你的描述太模糊了。您需要向我们展示预期的输出。