我有这个字符串:
[a [a b] [c e f] d]
我想要一个像这样的列表
lst[0] = "a"
lst[1] = "a b"
lst[2] = "c e f"
lst[3] = "d"
我目前的实现,我不认为是优雅/ pythonic是两个递归函数(一个与'['分裂) 和另一个']')但我相信它可以 使用列表推导或正则表达式完成(但我无法找到一种理智的方法)。
有什么想法吗?
答案 0 :(得分: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']
答案 1 :(得分:1)
好吧,如果它是一个递归数据结构,你将需要一个递归函数来干净地导航它。
但Python确实有一个可能有用的tokenizer库: http://docs.python.org/library/tokenize.html
答案 2 :(得分: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
当然,这可能会得到改进,并且会创建字符串列表的列表列表,这与您的示例所需的不完全相同。但是,它确实处理树的任意深度。