我有这个字符串:
[a [a b] [c e f] d]
我想要这样的清单
lst[0] = "a"
lst[1] = "a b"
lst[2] = "c e f"
lst[3] = "d"
我不认为是优雅/pythonic 的当前实现是两个递归函数(一个用 '[' 拆分,另一个用 ']' 拆分)但我确信它可以使用列表推导或正则表达式来完成(但我可以想不出一个理智的方法来做到这一点)。
有任何想法吗?
我有这个字符串:
[a [a b] [c e f] d]
我想要这样的清单
lst[0] = "a"
lst[1] = "a b"
lst[2] = "c e f"
lst[3] = "d"
我不认为是优雅/pythonic 的当前实现是两个递归函数(一个用 '[' 拆分,另一个用 ']' 拆分)但我确信它可以使用列表推导或正则表达式来完成(但我可以想不出一个理智的方法来做到这一点)。
有任何想法吗?
实际上,这确实不是递归数据结构,请注意,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']
好吧,如果它是一个递归数据结构,您将需要一个递归函数来干净地导航它。
但是 Python 确实有一个可能有用的标记器库:http: //docs.python.org/library/tokenize.html
如果它是一个递归数据结构,那么递归是很好的遍历它。 但是,解析字符串以创建结构不需要递归。我会这样做的另一种方法是迭代:
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
当然,这可能会得到改进,它将创建字符串列表的列表列表,这并不是您的示例想要的。但是,它确实可以处理树的任意深度。