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

2024-06-10 23:13:20 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑: 假设我有一串嵌套的圆括号如下:((AB)CD(E(FG)HI((J(K))L)))(假设副词是平衡的,并且正确地括起来 如何递归地删除每个全封闭圆括号子集的第一组全封闭偏旁命题?你知道吗

所以在这种情况下是(ABCD(E(FG)HI(JK))。(AB)会变成AB,因为(AB)是一组闭圆括号中的第一组闭圆括号(从(AB)到K)),E也是一组圆括号中的第一个元素,但因为它没有圆括号,所以什么都不会改变,(J)是集合((J)K)中的第一个元素,因此圆括号会被删除。你知道吗

这类似于构建表达式树,到目前为止,我已经将其解析为嵌套列表,并认为我可以递归地检查每个嵌套列表的第一个元素是否为instance(type(list)),但我不知道如何进行?你知道吗

嵌套列表如下所示:

arr = [['A', 'B'], 'C', 'D', ['E', ['F', 'G'], 'H', 'I', [['J'], 'K']]]

或许可以将其转换为:

arr = [A, B, C, D, [E, [F, G], H, I, [J, K]]

有更好的办法吗?你知道吗


Tags: 元素编辑列表ab情况cdhi子集
2条回答

如果我正确理解了这个问题,那么这个丑陋的函数应该可以做到:

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))。你知道吗

你需要把你的逻辑简化成足够清晰的程序。我从你的解释中得到的是下面的代码。注意,我没有处理边缘情况:您需要检查None元素,点击列表的末尾,等等

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

相关问题 更多 >