如何递归删除嵌套parantheses字符串中的第一组parantheses? (在Python中)

时间:2016-10-17 15:49:05

标签: python string algorithm recursion

编辑: 假设我有一串嵌套括号如下:((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]]

有更好的方法吗?

2 个答案:

答案 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))。