将JSON键:扁平结构中的值对变换为键:值树结构
可以将相同“级别”(平面结构)中的键值对数据对列表转换为树结构键值:数据?将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"
}
}
}
}
}
}
我尝试(即工作,但可能不是最佳的解决方案):
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'}}}}}}
函数中的列表理解__init __(self,kvlist)给出错误:**“字符串索引必须是整数,而不是str”**。 kvlist是一个列表,这个问题在哪里?谢谢 – AbreuFreire
你的意思是词典理解,对吧?你正在使用哪个版本的Python?它在3.5上适用于我。 – Guillaume
如果您的python版本不支持dict comprehension,则用'self._map = dict((item [“COD”],item [“VAL”])替换该行。 – Guillaume
是关键列表吗? [{“COD”:“20000”,“VAL”:“Fanerozoico”},{“COD”:“23000”,“VAL”:“Cenozoico”},{“COD”:“23300”,“VAL” “Quaternario”},{“COD”:“23310”,“VAL”:“Pleistocenico”},{“COD”:“23314”,“VAL”:“Pleistocenico Superior”}]? – Backtrack
是@Backtrack是一个列表 – AbreuFreire
你能解释为什么'Quaternario'和'Neogenico'最终在同一个水平?我在这里看不到逻辑。 – Guillaume