我有分层的 TCL 值,表示为如下字符串:
a {x y v w} b {i j k m}
。
上面的值包含3个字典对象,可以使用TCL表达式查询。
我需要将这样的值转换为相应的Python层次值。对于上面的字符串,Python 值将是:
{'a': {'x': 'y', 'v': 'w'}, 'b': {'i': 'j', 'k': 'm'}}
。
标准Python模块tkinter可以将TCL值转换为Python值。
但是它可以将层次结构值(就像我上面提供的那样)转换为其 Python 等效值吗?
下面的算法目前只是一个创可贴,直到你找到一种更容易理解的方法来解决你的问题:
res
字典和一个临时字典 curr
。如果你有更多的级别,你需要一个 dfs 递归函数(你需要编写)。
import re
def f(tcl):
st = re.split(r'(?<={)|(?=})|\s+', tcl)
curr, res = {}, {}
flag = True
for i, ch in enumerate(st):
if flag:
top_key = ch
flag = False
continue
elif ch == '{':
key = val = None
curr = {}
continue
elif ch == '}':
res[top_key] = curr
flag = True
continue
if not key:
key = ch
else:
val = ch
curr[key] = val
key = val = None
return res
print(f("a {x y v w} b {i j k m}"))
print(f("a {k1 v1 k2 v2} b {k3 v3 k4 v4}"))
print(f("a {k1 v1 k2 v2} b {k3 v3 k4 v4}"))
print(f("a {k1 v1 k2 v2} b {k3 v3 k4 v4 k5 None}"))
print(f("a {k1 v1 k2 v2} b {k3 v3 k4 v4 k5 None None None}"))
print(f("None {k1 v1 k2 v2} None {k3 v3 k4 v4 k5 None None None}")) # Note: fails for these test cases
打印:
{'a': {'x': 'y', 'v': 'w'}, 'b': {'i': 'j', 'k': 'm'}}
{'a': {'k1': 'v1', 'k2': 'v2'}, 'b': {'k3': 'v3', 'k4': 'v4'}}
{'a': {'k1': 'v1', 'k2': 'v2'}, 'b': {'k3': 'v3', 'k4': 'v4'}}
{'a': {'k1': 'v1', 'k2': 'v2'}, 'b': {'k3': 'v3', 'k4': 'v4', 'k5': 'None'}}
{'a': {'k1': 'v1', 'k2': 'v2'}, 'b': {'k3': 'v3', 'k4': 'v4', 'k5': 'None', 'None': 'None'}}
{'None': {'k3': 'v3', 'k4': 'v4', 'k5': 'None', 'None': 'None'}}
O(N) 时间和 O(N) 空间