编辑: 假设我有一串嵌套括号如下:((AB)CD(E(FG)HI((J(K))L)))(假设parantheses是平衡的并且包含在一起 如何以递归方式删除完全括号括号的每个子集的第一组完全包含的parantheses?
因此在这种情况下(ABCD(E(FG)HI(JK))。(AB)将变为AB,因为(AB)是一组闭括号中的第一组闭括号(来自(AB))对于K)),E也是一组括号中的第一个元素,但由于它没有括号,所以没有任何改变,而(J)是集合中的第一个元素((J)K),因此括号将被删除。
这类似于构建表达式树,到目前为止,我已将其解析为嵌套列表,并认为我可以递归检查每个嵌套列表的第一个元素是否为实例(类型(列表))但我不是知道怎么办?
嵌套列表如下:
arr = [['A', 'B'], 'C', 'D', ['E', ['F', 'G'], 'H', 'I', [['J'], 'K']]]
或许将其转换为:
arr = [A, B, C, D, [E, [F, G], H, I, [J, K]]
有更好的方法吗?
答案 0 :(得分:0)
您需要将逻辑降低到足够清晰的程度。我从您的解释中获得的内容将如下所示。请注意,我还没有处理边缘情况:您需要检查无元素,点击列表末尾等等。
def simplfy(parse_list):
# Find the first included list;
# build a new list with that set of brackets removed.
reduce_list = []
for pos in len(parse_list):
elem = parse_list[pos]
if isinstance(elem, list):
# remove brackets; construct new list
reduce_list = parse_list[:pos]
reduce_list.extend(elem)
reduce_list.extend(parse_list[pos+1:]
# Recur on each list element
return_list = []
for elem in parse_list
if isinstance(elem, list):
return_list.append(simplfy(elem))
else:
return_list.append(elem)
return return_list
答案 1 :(得分:0)
如果我正确地理解了这个问题,那么这个丑陋的功能应该可以解决问题:
def rm_parens(s):
s2 = []
consec_parens = 0
inside_nested = False
for c in s:
if c == ')' and inside_nested:
inside_nested = False
consec_parens = 0
continue
if c == '(':
consec_parens += 1
else:
consec_parens = 0
if consec_parens == 2:
inside_nested = True
else:
s2.append(c)
s2 = ''.join(s2)
if s2 == s:
return s2
return rm_parens(s2)
s = '((AB)CD(E(FG)HI((J)K))'
s = rm_parens(s)
print(s)
请注意,此函数将递归调用自身,直到不存在连续的括号。但是,在你的例子中,((AB)CD(E(FG)HI((J)K)),一次调用足以产生(ABCD(E(FG)HI(JK))。