要求:
1,将txt中的数据转化为json数据
2,查找某个词的路径,如 查找 '感知机' 返回路径为 ['机器学习', '神经网络', '多层网络', '感知机']
机器学习,线性模型,线性回归,最小二乘法
,神经网络,神经元模型,激活函数
,,多层网络,感知机
,,,连接权
,强化学习,有模型学习,策略评估
,,,策略改进
,,免模型学习,蒙特卡洛方法
,,,时序差分学习
,,模仿学习,直接模仿学习
,,,逆强化学习
将上面的数据转化为下面的格式,一个逗号表示省略上一行的一个词,两个逗号表示省略上一行的两个词
[{
"机器学习": [{
"线性模型": [{
"线性回归": [{
"最小二乘法": []
}]
}]
}, {
"神经网络": [{
"神经元模型": [{
"激活函数": []
}]
}, {
"多层网络": [{
"感知机": []
}, {
"连接权": []
}]
}]
}, {
"强化学习": [{
"有模型学习": [{
"策略评估": []
}, {
"策略改进": []
}]
}, {
"免模型学习": [{
"蒙特卡洛方法": []
}, {
"时序差分学习": []
}]
}, {
"模仿学习": [{
"直接模仿学习": []
}, {
"逆强化学习": []
}]
}]
}]
}]
import json
keys = [] # key 来记录字典的层数,一级字典的key
list1 = [] # 保存数据的列表
li_last = [] # 要插入list1列表的位置,引用list1的地址,所以直接在这个列表中插入就等于在list1中合适的位置插入了
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('感知机'))