json 巢狀和txt轉化的問題
阿新 • • 發佈:2018-12-26
要求:
1,將txt中的資料轉化為json資料
2,查詢某個詞的路徑,如 查詢 '感知機' 返回路徑為 ['機器學習', '神經網路', '多層網路', '感知機']
機器學習,線性模型,線性迴歸,最小二乘法 ,神經網路,神經元模型,啟用函式 ,,多層網路,感知機 ,,,連線權 ,強化學習,有模型學習,策略評估 ,,,策略改進 ,,免模型學習,蒙特卡洛方法 ,,,時序差分學習 ,,模仿學習,直接模仿學習 ,,,逆強化學習 將上面的資料轉化為下面的格式,一個逗號表示省略上一行的一個詞,兩個逗號表示省略上一行的兩個詞 [{ "機器學習": [{ "線性模型": [{ "線性迴歸": [{ "最小二乘法": [] }] }] }, { "神經網路": [{ "神經元模型": [{ "啟用函式": [] }] }, { "多層網路": [{ "感知機": [] }, { "連線權": [] }] }] }, { "強化學習": [{ "有模型學習": [{ "策略評估": [] }, { "策略改進": [] }] }, { "免模型學習": [{ "蒙特卡洛方法": [] }, { "時序差分學習": [] }] }, { "模仿學習": [{ "直接模仿學習": [] }, { "逆強化學習": [] }] }] }] }]
import json keys = [] # key 來記錄字典的層數,一級字典的key list1 = [] li_last = [] def func(key, li): if not li: li.append({key: []}) if li and key not in [key for i in li for key in i.keys()]: li.append({key: []}) def notes2json(file_path): with open(file_path, encoding='utf-8') as f: for line in f: li = line.strip().split(',') count = li.count('') keys[count:] = li[count:] for index in range(len(keys)): if index == 0: func(keys[index], list1) li_last = list1[-1][keys[index]] else: func(keys[index], li_last) li_last = li_last[-1][keys[index]] return json.dumps(list1, ensure_ascii=False) # 如果只返回的機器學習的就list1[0],如果要返回所有的內容就list1 json_str = notes2json('t3.txt') print(json_str) li = json.loads(json_str) # 這裡必須是列表,所以如果notes2json返回的是字典時應當 [json.loads(json_str)] q = [] result = [] def li2q(li,key,x=None): for i in li: for k,v in i.items(): q.append({k:x}) if k == key: return q if v: li2q(v,key,k) def find(targt): first_targt = targt li2q(li,targt) while 1: for i in q: k = list(i.keys())[0] if k == targt: result.insert(0, k) targt = i[k] if not targt or not result: break return result if result else f'不存在關鍵字:{first_targt}' print(find('感知機'))