2016-08-31 80 views
0

創建類型的字典新字典我開始從一個API如何從嵌套類型的字典的字典在Python

start_dict = { 
    "a": 795, 
    "b": 1337, 
    "c": [ 
     { 
      "d1": 2, 
      "d2": [ 
       { 
         "e1": 4 
       } 
     ] 
     } 
    ] 
    } 

我需要創建從字典單獨的字典收到的字典。每個鍵和值都由它們的鍵和值分隔到自己的字典中。同時保持嵌套的字典完整。

values = 
{ 
"fields": [ 
    { 
    "element_name": "a", 
    "value": 795 
    }, 
    { 
    "element_name": "b", 
    "value": 1337 
    }, 
    { 
    "element_name": "c", 
    "value": [ 
      { 
       "element_name": "d1", 
       "value": 2 
      }, 
      { 
       "element_name": "d2", 
       "value" : [ 
          { 
           "element_name": "e1", 
           "value": 4 
          } 
         ] 
      ] 
     } 
    ] 
    } 

實際字典是一個相當大一點,但也有在原有但是許多單嵌套類型的字典沒有一個以上的兩道深深的嵌套類型的字典。這是api接受新數據的唯一方式,所以我有點卡住,直到我弄明白爲止。任何幫助是非常感謝,因爲我是相當新的Python(3周)大聲笑,所以如果這是簡單的事情,請不要苛刻。

+0

你試着自己寫一些東西?在問題中加入一些代碼... – Dekel

+0

你的'c'值有點謎。列表中包含單個字典,但結果輸出是一個列表,其中的一個字典中的鍵值對轉換爲單獨的字典。如果'c'列表中有多個元素會發生什麼?如果包含更多列表或者不是字典的對象會怎麼樣?這同樣適用於'd2'。 –

+0

下面的解決方案導致*嵌套*列表,因爲單個字典被轉換爲鍵值字典列表。如果有多個字典,則表示這些字典中的每一個都成爲主'c'列表中的單獨列表。任何其他對象類型也可以通過這種方式正確處理。 –

回答

5

可以建立與一個遞歸函數的輸出:

def transform(ob): 
    if isinstance(ob, list): 
     return [transform(v) for v in ob] 
    elif not isinstance(ob, dict): 
     return ob 
    return [{'element_name': k, 'value': transform(v)} 
      for k, v in ob.items()] 

values = {'fields': transform(start_dict)} 

所以每個key, value對被變換爲{'element_name': key, 'value': value}字典中的列表,其中,其本身的列表或字典中的任何值由遞歸變換呼叫。

演示:

>>> from pprint import pprint 
>>> def transform(ob): 
...  if isinstance(ob, list): 
...   return [transform(v) for v in ob] 
...  elif not isinstance(ob, dict): 
...   return ob 
...  return [{'element_name': k, 'value': transform(v)} 
...    for k, v in ob.items()] 
... 
>>> start_dict = { 
...  "a": 795, 
...  "b": 1337, 
...  "c": [ 
...   { 
...    "d1": 2, 
...    "d2": [ 
...     { 
...      "e1": 4 
...     } 
...   ] 
...   } 
...  ] 
...  } 
>>> pprint({'fields': transform(start_dict)}) 
{'fields': [{'element_name': 'a', 'value': 795}, 
      {'element_name': 'c', 
      'value': [[{'element_name': 'd1', 'value': 2}, 
         {'element_name': 'd2', 
         'value': [[{'element_name': 'e1', 'value': 4}]]}]]}, 
      {'element_name': 'b', 'value': 1337}]} 
+0

因此,當使用嵌套字典時,您需要一個遞歸函數,以便當它遇到嵌套字典時,它可以循環回到函數和繼續。在字典上的字典工作?非常感謝你的幫助,非常感謝! – Astrea

+0

請注意,您不*使用遞歸;我發現爲此編寫一個遞歸函數更容易。你也可以使用堆棧和循環。 –