将拼合字典的元素分组为子列表

时间:2018-07-14 11:28:01

标签: python list dictionary

我有一个扁平化的json(使用flatten 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,但我什至无法远程了解。

有没有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

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

webView = (WebView) findViewById(R.id.webView);

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

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) 中,而您希望的输出在input_中。

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

final_dict