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

  

猜你喜欢

转载自www.cnblogs.com/perfey/p/10178606.html