如何将包含字典的分层 TCL 字符串值转换为等效的 Python 分层值?

问题描述 投票:0回答:1

我有分层的 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 等效值吗?

python tcl
1个回答
0
投票

下面的算法目前只是一个创可贴,直到你找到一种更容易理解的方法来解决你的问题:

  • 我假设你有两个级别,有一个总体
    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) 空间

© www.soinside.com 2019 - 2024. All rights reserved.