2017-08-14 176 views
-1

下面是示例列表數據,我想將其轉換爲動態字典。Python - 從字典列表創建動態嵌套字典

result = [ 
    { 
     "standard": "119", 
     "score": "0", 
     "type": "assignment", 
     "student": "4" 
    }, 
    { 
     "standard": "119", 
     "score": "0", 
     "type": "assignment", 
     "student": "5" 
    }, 
    { 
     "standard": "118", 
     "score": "0", 
     "type": "assessment", 
     "student": "4" 
    } 
] 

我想創建一個功能conv_to_nested_dict(*指定參數時,數據),其中convertes鍵的所有列表動態dictonary。

例如:conv_to_nested_dict([ '標準', '學生'],結果)應該給運算:

{ 
    "118": { 
     "4": [{ 
      "score": "0", 
      "type": "assessment" 
     }] 
    }, 
    "119": { 
     "4": [{ 
      "score": "0", 
      "type": "assignment" 
     }], 
     "5": [{ 
      "score": "0", 
      "type": "assignment" 
     }] 
    } 

} 

conv_to_nested_dict([ '標準', '類型'],結果)

{ 
    "118": { 
     "assessment": [{ 
      "score": 0, 
      "student": "4" 
     }] 
    }, 
    "119": { 
     "assignment": [{ 
      "score": 0, 
      "student": "4" 
     },{ 
      "score": 0, 
      "student": "5" 
     }] 
    } 

} 
+0

這是你的作業嗎? – wroniasty

+0

@wroniasty我在思考邏輯時被卡住了,我嘗試了一些方法,比如在Python和過濾器中使用group。我想使它具有通用性和動態性,因此請求幫助。我面臨的主要問題是鍵在輸出字典中是動態的。 – Akash

+0

期望的輸出結構似乎存在錯誤。你有一個沒有關閉的列表。請清理並澄清問題 –

回答

1

這是一個大概的想法。

def conf_to_nested_dict(keys, result): 
    R = {} 
    for record in result: 
     node = R 
     for key in keys[:-1]: 
      kv = record[key] 
      next_node = node.get(kv, {}) 
      node[kv] = next_node 
      node = next_node 
     last_node = node.get(record[keys[-1]], []) 
     last_node.append(record) 
     node[record[keys[-1]]] = last_node 


    return R 

#R is your structure 

result是你的源陣列,keys是由要分組結果的關鍵。迭代每個記錄的結果 - 根據鍵值(記錄[鍵])創建樹結構。對於最後一個鍵 - 創建一個列表並將記錄追加到它。

+0

非常感謝,這工作得很好。你救了我的一天,謝謝。 :) – Akash