Python 3.6嵌套字典动态更新
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python 3.6嵌套字典动态更新,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2392字,纯文字阅读大概需要4分钟。
内容图文
![Python 3.6嵌套字典动态更新](/upload/InfoBanner/zyjiaocheng/797/4ae3472c6ad64eabb339afc41284ff29.jpg)
我有一个如下文件:
HP;1<br/>
MN;stringval<br/>
IS/VD1;32.00<br/>
IS/HD1;1.34<br/>
IS/E/ID;362.0000000<br/>
IS/OLVD;0.0000000<br/>
ISN/I/HFD;3283.8999023<br/>
D1/I/MF;7.3059464<br/>
D1/I/P;32.0388412<br/>
D1/E/E;2778.4829102<br/>
D1/S1/SB/I/P;32.0388412<br/>
EN;5145<br/>
之后 ”;”我希望将其放入字典中.
每个单词后跟/都是关键.
我的最终目标是拥有以下字典:
{"HP":1.0,"MN":'stringval',"IS":{"VD1":32.00,"HD1":1.34,"E":{"ID":362.0000000},"OLVD":0.0000000},"ISN":{"I":{"HFD":3283.8999023}},"D1":{"I":{"MF":7.3059464,"P":32.03884},"E":{"E":2778.4829102},"S1":{"SB":{"I":{"P":32.0388412}}}},"EN":5145}
我不知道最终字典的最大级别数.
我尝试了以下代码:
fid = open(myfile,mode='r')
content=fid.readlines()
content = [x.replace(' ','').strip() for x in content]
outdata = dict()
for i in content:
dict_struct = i.split(';')[0]
val = i.split(';')[-1]
n_lev = dict_struct.count('/')
test2 = '{"' + dict_struct.replace('/', '":{"') + '":' + val + '}' * (n_lev + 1)
try:
outdata.update(eval(test2))
print(test2)
except:
test2 = '{"' + dict_struct.replace('/', '":{"') + '":"' + val + '"' + '}' * (n_lev + 1)
print(test2)
outdata.update(eval(test2))
此代码不起作用,因为update()实际上覆盖了一些输入;这是输出:
{"HP": 1, "MN": "stringval", "IS": {"OLVD": 0.0}, "ISN": {"I": {"HFD": 3283.8999023}}, "D1": {"S1": {"SB": {"I": {"P": 32.0388412}}}}, "EN": 5145}
你能给我一些提示吗?
解决方法:
您可以使用字典结构构建树
我的解决方案
import json,sys
def update(k,v):
d = {}
d[k]=v
return d
def processRow(row):
value = row.split(';', 2)
#print(value)
if len(value)<=1:
return
keys = value[0].split('/')
v=value[1]
try:
v=[float(v)]
except:
v=[v]
for i, e in reversed(list(enumerate(keys))):
v = update(e,v)
return v
def updateTree(dic, tree):
#print("IN %s -> OUT %s" % (dic, json.dumps(tree, indent = 4)))
#print()
for key in dic:
value=dic[key]
subtree = tree.get(key)
if subtree and isinstance(subtree, dict):
updateTree(value,subtree)
elif subtree and isinstance(subtree, list) and isinstance(value, list):
subtree.extend(value)
elif not(subtree):
tree.update(dic)
else:
sys.stderr.write ("ERROR: incoherent data type %s vs %s" % (dic, json.dumps(tree, indent = 4)))
txt = "HP;1\nMN;stringval\nIS/VD1;32.00\nIS/HD1;1.34\nIS/E/ID;362.0000000\n"
rows = txt.split('\n')
x = []
t={}
for row in rows:
v = processRow(row)
if (v):
updateTree(v,t)
print (json.dumps(t, indent = 4))
结果是
{
"HP": [
1.0
],
"MN": [
"stringval"
],
"IS": {
"VD1": [
32.0
],
"HD1": [
1.34
],
"E": {
"ID": [
362.0
]
}
} }
内容总结
以上是互联网集市为您收集整理的Python 3.6嵌套字典动态更新全部内容,希望文章能够帮你解决Python 3.6嵌套字典动态更新所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。