我有一个像这样的字符串列表:
lst= ['(', 'A', '(', 'B', '(', 'C', 'D', ')', '(', 'E', 'F', ')', ')', '(', 'G', 'H', ')', ')']
加入它看起来像这样:
(A(B(CD)(EF))(GH))
我希望按元素遍历列表并将值存储到两个列表中:['A','B','G']
['B', 'C', 'E']
我试图这样做:
l1=[]
for i in range(len(lst)):
if lst[i] == '(':
l1.append(lst[i+1])
如何打破计算,使其计算打开和关闭paranthesis的数量,以及当左括号获得其右括号时,然后在下一个左括号后添加元素,以获得结果:{{1} } ['A','B','G']
?
答案 0 :(得分:0)
import re
string = ''.join(lst)
results = []
for match in re.finditer('\w\(', string):
parens = 0
substring = string[match.start():]
results.append([substring[0]])
for ii, ch in enumerate(substring):
if ch == '(':
parens += 1
if parens == 1:
results[-1].append(substring[ii+1])
elif ch == ')':
parens -= 1
if parens < 0:
break
或没有正则表达式:
results = []
for jj in range(len(lst) - 1):
if lst[jj] != ')' and lst[jj+1] == '(':
parens = 0
results.append([lst[jj]])
substring = lst[jj:]
for ii, ch in enumerate(substring):
if ch == '(':
parens += 1
if parens == 1:
results[-1].append(substring[ii+1])
elif ch == ')':
parens -= 1
if parens < 0:
break
答案 1 :(得分:0)
如果我理解正确,字符串表示树结构,每个节点都有一个名称和任意数量的子节点。在s表达式样式中,此名称是列表中的第一个条目(如果有列表;叶节点仅被命名)。
(A
(B
(CD)
(EF))
(GH))
在此树中,您希望打印出具有多个分支的节点,包括这些分支的名称,但不包括其内容。使用堆栈解析它们确实最简单,可能隐含在递归中。
from pprint import pprint
instr="(A(B(CD)(EF))(GH))"
nodes=[]
curnode=nodes
nodestack=[]
for char in instr:
if char == '(':
nodestack.append(curnode)
curnode.append([])
curnode=curnode[-1]
elif char == ')':
curnode=nodestack.pop()
else:
curnode.append(char)
# Show that the tree is now converted into list form
pprint(nodes, width=20)
def name(node):
return node[0]
def branches(tree):
if len(tree)>=3:
yield map(name,tree) # exploits that names are only 1 char
for branch in tree[1:]:
# search deeper also
for subbranch in branches(branch):
yield subbranch
for root in nodes:
pprint(list(branches(root)))
通过在完成解析时打印分支节点,可以合并操作(在')'
情况下)。