1. 程式人生 > >json 巢狀和txt轉化的問題

json 巢狀和txt轉化的問題

要求:

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('感知機'))