2016-09-16 124 views
0

可以將相同「級別」(平面結構)中的鍵值對數據對列表轉換爲樹結構鍵值:數據?將JSON鍵:扁平結構中的值對變換爲鍵:值樹結構

例子:

來源:

[{"COD": "20000", "VAL": "Fanerozoico"}, {"COD": "23000", "VAL": "Cenozoico"}, {"COD": "23300", "VAL": "Quaternario"}, {"COD": "23310", "VAL": "Pleistocenico"}, {"COD": "23314", "VAL": "Pleistocenico Superior"}, {"COD": "23200", "VAL": "Neogénico"}, {"COD": "23220", "VAL": "Pliocénico"}, {"COD": "23222", "VAL": "Piacenziano"}] 

分爲:

{ 
"Fanerozoico": { 
    "COD": "20000", 
    "Cenozoico": { 
     "COD": "23000", 
     "Quaternario": { 
      "COD": "23300", 
      "Pleistocenico": { 
       "COD": "23310", 
       "Pleistocenico Superior": { 
        "COD": "23314" 
       } 
      } 
     }, 
     "Neogenico": { 
      "COD": "23200", 
      "Pliocenico": { 
       "COD": "23220", 
       "Piacenziano": { 
        "COD": "23222" 
       } 
      } 
     } 
    } 
} 
} 
+1

是關鍵列表嗎? [{「COD」:「20000」,「VAL」:「Fanerozoico」},{「COD」:「23000」,「VAL」:「Cenozoico」},{「COD」:「23300」,「VAL」 「Quaternario」},{「COD」:「23310」,「VAL」:「Pleistocenico」},{「COD」:「23314」,「VAL」:「Pleistocenico Superior」}]? – Backtrack

+0

是@Backtrack是一個列表 – AbreuFreire

+0

你能解釋爲什麼'Quaternario'和'Neogenico'最終在同一個水平?我在這裏看不到邏輯。 – Guillaume

回答

0

我嘗試(即工作,但可能不是最佳的解決方案):

mylist = [ 
    {"COD": "20000", "VAL": "Fanerozoico"}, 
    {"COD": "23000", "VAL": "Cenozoico"}, 
    {"COD": "23300", "VAL": "Quaternario"}, 
    {"COD": "23310", "VAL": "Pleistocenico"}, 
    {"COD": "23314", "VAL": "Pleistocenico Superior"}, 
    {"COD": "23200", "VAL": "Neogénico"}, 
    {"COD": "23220", "VAL": "Pliocénico"}, 
    {"COD": "23222", "VAL": "Piacenziano"} 
] 


COD_LEN = 5 

class CODMapper(object): 
    def __init__(self, kvlist): 
     self._map = {item["COD"]: item["VAL"] for item in kvlist} 

    def getchildren(self, key): 
     ' return a list of all direct children of a given key ' 
     if len(key) == COD_LEN: 
      return [] 
     suffix = "0"*(COD_LEN-len(key)-1) 
     return [(cod, val) for cod, val in self._map.items() 
         if cod.startswith(key) 
         and cod.endswith(suffix) 
         and cod[len(key)] != "0" 
       ] 

    def todict(self, key=""): 
     ' Creates the dictionnary structured as you want ' 
     children = self.getchildren(key) 
     result = {} 
     for cod, val in children: 
      inner_dict = {"COD": cod} 
      new_key = cod[:len(key)+1] 
      inner_dict.update(self.todict(new_key)) 
      result[val] = inner_dict 
     return result 



from pprint import pprint 
pprint(CODMapper(mylist).todict()) 

威爾輸出:

{'Fanerozoico': {'COD': '20000', 
    'Cenozoico': {'COD': '23000', 
     'Neogénico': {'COD': '23200', 
      'Pliocénico': {'COD': '23220', 
       'Piacenziano': {'COD': '23222'}}}, 
     'Quaternario': {'COD': '23300', 
      'Pleistocenico': {'COD': '23310', 
       'Pleistocenico Superior': {'COD': '23314'}}}}}} 
+0

函數中的列表理解__init __(self,kvlist)給出錯誤:**「字符串索引必須是整數,而不是str」**。 kvlist是一個列表,這個問題在哪裏?謝謝 – AbreuFreire

+0

你的意思是詞典理解,對吧?你正在使用哪個版本的Python?它在3.5上適用於我。 – Guillaume

+0

如果您的python版本不支持dict comprehension,則用'self._map = dict((item [「COD」],item [「VAL」])替換該行。 – Guillaume