python的字典中,如何向指定路径添加值?

想实现一个函数,传入字典,路径/键的列表和值,返回修改后的字典。大概是这个意思
defadd_value(dict,path,value):
#dict是待修改的字典
#path是路径,列表形式,如`['A','B','C']`,A目录下有B目录,B目录下有C目录
#value是一个元组、列表、字典或者字符串
……
returndict
需要实现的功能大概像这样:
d={}
add_value(d,['A','B','C'],('output.txt','2mb'))
{'A':{'B':{'C':[('output.txt','2mb')]}}}
add_value(d,['X','Y'],('log.txt','10kb'))
{'A':{'B':{'C':'string'}},'X':{'Y':[('log.txt','10kb'),]}}
add_value(d,['A','B','C'],('video.mp4','2GB'))
{'A':{'B':{'C':[('output.txt','2mb'),('video.mp4','2GB')]}},'X':{'Y':{'Z':[('log.txt','10kb'),]}}}
path的长度是不定的,或者说目录的深度是不定的,所以好像要用循环调用,不能用几个if结构。python新手,实在不知如何实现,求教。
Helenr
浏览 1146回答 2
2回答

一只萌萌小番薯

如果不是做特定的oj题目的话,推荐使用xml,更直观,也更好管理fromlxmlimportetreedefgen_xpath(path):return'//root/'+'/'.join(path)defadd_value(root,path,value):purpose_path=gen_xpath(path)folder=root.xpath(purpose_path)parent_folder=rootifnotfolder:fori,nameinenumerate(path,1):temp_path=gen_xpath(path[:i])temp_folder=root.xpath(temp_path)ifnottemp_folder:parent_folder=etree.SubElement(parent_folder,name)else:parent_folder=temp_folderfolder=root.xpath(purpose_path)[0]file=etree.SubElement(folder,'file')file.set('name',value[0])file.set('size',value[1])if__name__=='__main__':root=etree.Element('root')add_value(root,['A','B','C'],('output.txt','2mb'))add_value(root,['X','Y'],('log.txt','10kb'))add_value(root,['A','B','C'],('video.mp4','2GB'))etree.ElementTree(root).write('test.xml',pretty_print=True)输出结果:

湖上湖

defadd_value(dict_obj,path,value):obj=dict_objfori,vinenumerate(path):ifi+1==len(path):ifnotisinstance(obj.get(v,''),list):obj[v]=list()obj[v].append(value)continueobj[v]=obj.get(v,'')ordict()obj=obj[v]returndict_objd={}printadd_value(d,['A','B','C'],('output.txt','2mb'))printadd_value(d,['X','Y'],('log.txt','10kb'))printadd_value(d,['A','B','C'],('video.mp4','2GB'))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript