加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

删除表达式树中第一个元素周围和Python中每个子表达式树中的括号

发布时间:2020-12-20 13:14:34 所属栏目:Python 来源:网络整理
导读:目标是实现简化操作:删除表达式树及其每个子表达式树中第一个元素周围的括号,其中表达式作为包含在各种括号中的字符串输入给出.这必须适用于任意数量的括号,例如: (12)3((45)6) – 123(456),删除括号约12然后约45 ((12)3)4(((5)67)8) – 1234(5678),删除12
目标是实现简化操作:删除表达式树及其每个子表达式树中第一个元素周围的括号,其中表达式作为包含在各种括号中的字符串输入给出.这必须适用于任意数量的括号,例如:

(12)3((45)6) – > 123(456),删除括号约12然后约45

((12)3)4(((5)67)8) – > 1234(5678),删除12左右的括号,然后是123,然后是5,然后是567.不要删除5678左右的括号,因为那是第二个元素.

我该怎么做呢?

编辑:到目前为止我所拥有的是:

def simplify(expression):
    """
    call itself recursively until no consecutive parentheses exist
    """
    result = []
    consec_parens = 0
    inside_nested = False
    for char in expression:
        if char == ')' and inside_nested:
            inside_nested = False
            consec_parens = 0
            continue
        if char == '(':
            consec_parens += 1
        else:
            consec_parens = 0
        if consec_parens == 2:
            inside_nested = True
        else:
            result.append(char)
    result = ''.join(result)
    if result == expression:
        return result
    return simplify(result)

它适用于嵌套括号的数量至少为2的所有情况,但它对头部不起作用,即对于(AB)C,它不会删除AB周围的括号.但是,对于((AB)C),它删除了AB周围的括号,导致(ABC).

解决方法

这可以看作是一个有限状态机(有三个状态),你可以在每个级别实例化一次,其中每个(符号创建一个新的级别.或者,它是一个确定性的 pushdown automaton,有两个平凡的状态(一个进行中的状态和一个完成)状态,我们都没有显式建模)和三个堆栈符号,每个符号表示当前级别的机器状态:

>之前 – 我们进入一个级别后立即进入的状态.遇到任何字符,除了)转换到其他状态.
>内部 – 我们所处的状态,而在括号内需要删除.通过装饰来进入(在之前.
>完成 – 处理当前级别时我们所处的状态.这意味着我们已经删除了一组括号或者我们不需要,因为第一个元素没有包含在它们中.

此外,遇到a(将新符号推入堆栈,模型进入新级别,以及a)从中弹出一个符号,这些模型从一个级别离开.除非发生Before→Inside和Inside→Done转换,否则所有输入字符都会附加到结果上.

以下代码是上面对Python的简单翻译:

from enum import Enum

class State(Enum):
    Before = 0
    Inside = 1
    Done   = 2

def simplify(expression):
    levels = [State.Before]
    result = []

    for c in expression:
        if c == '(':
            if levels[-1] == State.Before:
                levels[-1] = State.Inside
            else:
                result.append(c)
            levels.append(State.Before)
        elif c == ')':
            levels.pop()
            if levels[-1] == State.Inside:
                levels[-1] = State.Done
            else:
                result.append(c)
        else:
            if levels[-1] == State.Before:
                levels[-1] = State.Done
            result.append(c)

    return ''.join(result)

测试以上,我们得到:

>>> simplify('(12)3((45)6)')
'123(456)'
 >>> simplify('((12)3)4(((5)67)8)')
'1234(5678)'
>>> simplify('(AB)C')
'ABC'
>>> simplify('((AB)C)')
'ABC'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读