1

我有这个字符串:

[a [a b] [c e f] d]

我想要这样的清单

lst[0] = "a"
lst[1] = "a b"
lst[2] = "c e f"
lst[3] = "d"

我不认为是优雅/pythonic 的当前实现是两个递归函数(一个用 '[' 拆分,另一个用 ']' 拆分)但我确信它可以使用列表推导或正则表达式来完成(但我可以想不出一个理智的方法来做到这一点)。

有任何想法吗?

4

3 回答 3

4

实际上,这确实不是递归数据结构,请注意,a并且d在单独的列表中。您只是将字符串拆分为括号字符并删除一些空格。

我相信有人可以找到更清洁的东西,但如果你想要一个像下面这样的单线,应该让你接近:

parse_str = '[a [a b] [c e f] d]'
lst = [s.strip() for s in re.split('[\[\]]', parse_str) if s.strip()]

>>>lst
['a', 'a b', 'c e f', 'd']
于 2009-07-23T16:20:25.247 回答
1

好吧,如果它是一个递归数据结构,您将需要一个递归函数来干净地导航它。

但是 Python 确实有一个可能有用的标记器库:http: //docs.python.org/library/tokenize.html

于 2009-07-23T15:56:43.827 回答
1

如果它是一个递归数据结构,那么递归是很好的遍历它。 但是,解析字符串以创建结构不需要递归。我会这样做的另一种方法是迭代:

origString = "[a [a b] [c [x z] d e] f]".split(" ")
stack = []
for element in origString:
    if element[0] == "[":
        newLevel = [ element[1:] ]
        stack.append(newLevel)
    elif element[-1] == "]":
        stack[-1].append(element[0:-1])
        finished = stack.pop()
        if len(stack) != 0:
            stack[-1].append(finished)
        else:
            root = finished
    else:
        stack[-1].append(element)
print root

当然,这可能会得到改进,它将创建字符串列表的列表列表,这并不是您的示例想要的。但是,它确实可以处理树的任意深度。

于 2009-07-23T16:45:24.960 回答