2015-10-23 157 views
0

我的词典列表如下,创建词典列表包含嵌套词典

[{"vehicle_class": "c1", "vehicle_class_count1": 16, "vehicle_usage_count1": 29, "vehicle_usage": "u1", "vehicle_type_count1": 16, "vehicle_type": "t1"}, {"vehicle_class": "c2", "vehicle_class_count1": 11, "vehicle_usage_count1": 29, "vehicle_usage": "u1", "vehicle_type_count1": 11, "vehicle_type": "t1"},{"vehicle_class": "c2", "vehicle_class_count1": 1, "vehicle_usage_count1": 29, "vehicle_usage": "u2", "vehicle_type_count1": 1, "vehicle_type": "t3"},{"vehicle_class": "c3", "vehicle_class_count1": 1, "vehicle_usage_count1": 29, "vehicle_usage": "u2", "vehicle_type_count1": 1, "vehicle_type": "t2"}] 

从中我想形成字典的另一个列表如下,

[ 
       { 
        "name": "u1", 
        "imageURL": "", 
        "type": "u1", 
        "children": [ 
         { 
          "name": "t1", 
          "imageURL": "", 
          "type": "t1", 
          "size": 9221 
          "children" : [ 
            {"name": "c1", 
            "imageURL": "", 
            "type": "c1", 
            "size": 9221}, 
            {"name": "c2", 
            "imageURL": "", 
            "type": "c2", 
            "size": 9221} 
          ] 
         } 
        ], 
        "size": 10393 
       }, 
       { 
        "name": "u2", 
        "imageURL": "", 
        "type": "u2", 
        "children": [ 
         { 
          "name": "t2", 
          "imageURL": "", 
          "type": "t2", 
          "size": 9221, 
          "children":[ 
            "name": "c3", 
            "imageURL": "", 
            "type": "c3", 
            "size": 9221 
          ] 
         }, 
         { 
          "imageURL": "", 
          "type": "t3", 
          "name": "t3", 
          "size": 1058, 
          "children": [ 
            "imageURL": "", 
            "type": "c2", 
            "name": "c2", 
            "size": 1058 
          ] 
         } 

        ], 
        "size": 10393 
       }, 

       ] 

这是我迄今为止所尝试过的,我曾经得到了预期结果的一半。

result_dict=[] # The above mentioned list comes here 
result_list = [] 
for i in ['vehicle_usage','vehicle_type','vehicle_class']: # This is a hierarchy which I assign here dynamically can contain any number of values. 
    for item in range(0, len(result_dict)): 
     for key,value in result_dict[item].items(): 
     if key == i: 
       if not any(d['name'] == value for d in result_list): 
       result = {} 
       result['name'] = value 
       result['imageURL'] = '' 
       result['type'] = value 
       result['size'] = result_dict[item]['%s_count1' % i] 
       if i != len(result_dict): 
        result['children'] =[] 
       print result 
       result_list.append(result) 
print result_list # Final list processed according to the required format. 

预计result_list顶尖水平字典必须包含像vehicle_usage_count1各自的值vehicle_usage不同的值。

第二级别(即儿童名单)将包含第二级别等。该数据发送到需要此格式的d3插件。

水平将依赖于价值数数前来

['vehicle_usage','vehicle_type','vehicle_class'] 

从我的代码的所有级别写入到同一水平。我希望他们写入正确的儿童名单。

+0

那么,你的代码只尝试'result_list.append(结果)'所以很明显,这一切都在同一水平上。 – abrunet

+0

@abrunet是的,但我怎么能说,去相关的儿童节点? –

+0

您应该尝试从初始词典中提取数据,迭代一次以提取第一级数据。然后迭代你创建的第一级,并为你的第一级的每个元素,从你的初始词典等检索数据... – abrunet

回答

1

这远非完美,但我认为它工作。

datalist = [{"vehicle_class": "c1", "vehicle_class_count1": 16, "vehicle_usage_count1": 29, "vehicle_usage": "u1", "vehicle_type_count1": 16, "vehicle_type": "t1"}, {"vehicle_class": "c2", "vehicle_class_count1": 11, "vehicle_usage_count1": 29, "vehicle_usage": "u1", "vehicle_type_count1": 11, "vehicle_type": "t1"},{"vehicle_class": "c2", "vehicle_class_count1": 1, "vehicle_usage_count1": 29, "vehicle_usage": "u2", "vehicle_type_count1": 1, "vehicle_type": "t3"},{"vehicle_class": "c3", "vehicle_class_count1": 1, "vehicle_usage_count1": 29, "vehicle_usage": "u2", "vehicle_type_count1": 1, "vehicle_type": "t2"}] 

levels_index = {1: 'vehicle_usage', 2: 'vehicle_type', 3: 'vehicle_class'} 


result = [] 


def build_node(obj, key): 
    '''This build the node for your result list''' 
    return { 
     'name': obj[key], 
     'imageURL': '', 
     'type': obj[key], 
     'size': obj['%s_count1' % key], 
     'children': [] 
    } 


def build_level(input_list, keyindex): 
    ''' This build one level at a time but call itself recursively''' 
    key = levels_index[keyindex] 
    levels_memory = {'vehicle_usage': [], 'vehicle_type': [], 'vehicle_class': []} 
    output = [] 
    for obj in input_list: 
     if obj[key] not in levels_memory[key]: 
      levels_memory[key].append(obj[key]) 
      output.append(build_node(obj, key)) 
      if keyindex < len(levels_index): 
       output[-1]['children'] = build_level(
        [_ for _ in input_list if _[key] == output[-1]['name']], 
        keyindex + 1) 
    return output 


print build_level(datalist, 1) 

这给了我下面的输出

[ 
    { 
     'children': [ 
      { 
       'children': [ 
        { 
         'children': [], 
         'imageURL': '', 
         'type': 'c1', 
         'name': 'c1', 
         'size': 16 
        }, { 
         'children': [], 
         'imageURL': '', 
         'type': 'c2', 
         'name': 'c2', 
         'size': 11 
        }], 
       'imageURL': '', 
       'type': 't1', 
       'name': 't1', 
       'size': 16}], 
     'imageURL': '', 
     'type': 'u1', 
     'name': 'u1', 
     'size': 29 
    }, { 
     'children': [{ 
      'children': [], 
      'imageURL': '', 
      'type': 't3', 
      'name': 't3', 
      'size': 1 
     }, { 
      'children': [{ 
       'children': [], 
       'imageURL': '', 
       'type': 'c3', 
       'name': 'c3', 
       'size': 1 
      }], 
      'imageURL': '', 
      'type': 't2', 
      'name': 't2', 
      'size': 1 
     }], 
     'imageURL': '', 
     'type': 'u2', 
     'name': 'u2', 
     'size': 29 
    } 
] 
+0

非常感谢你的时间和精力。有用。但还有一个小问题,如[{c1 - > c2 - > c3},{d1 - > d2 - > c3}]或[{c1 - > c2 - > c3},{d1 - > c2 - > d3}]重复的值不会到达两个地方的必要位置而是仅涉及第一个字典。那么上面提到的列表将显示为[{c1-> c2-> c3},{d1-> d2-> null}]或[{c1-> c2-> c3},{d1-> - > null - > null}]。我认为它不会添加到'levels_memory',因为它已经添加了。 –

+1

我编辑了代码。 'levels_memory'在'build_level'函数中被初始化。告诉我,如果它现在可以=) – abrunet

+0

WOW它的工作原理。千谢谢保存我的时间:) –