2016-09-16 116 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