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

2024-05-05

目标是实现简化操作:删除表达式树及其每个子表达式树中第一个元素周围的括号,其中表达式作为括在各个括号中的字符串输入给出。这必须适用于任意数量的括号,例如:

(12)3((45)6) -> 123(45​​6),删除 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)

它适用于嵌套括号数量至少为两个的所有情况,但不适用于头部,即对于 (AB)C,它不会删除 AB 周围的括号。但是,对于 ((AB)C),它会删除 AB 周围的括号,从而得到 (ABC)。


这可以被视为一个有限状态机(具有三个状态),您可以在每个级别实例化一次,其中每个(符号创造了一个新的水平。或者,它是一个确定性的下推自动机 https://en.wikipedia.org/wiki/Pushdown_automaton有两个简单的状态(一个正在进行的状态和一个完成的状态,我们都没有显式地建模)和三个堆栈符号,每个符号代表当前级别的机器状态:

  • Before- 进入关卡后我们立即所处的状态。遇到除)转换到其他某种状态。
  • Inside- 我们所处的状态 while 位于需要删除的括号内。遇到一个进入(而在Before.
  • Done- 当前关卡处理完毕后我们所处的状态。这意味着我们要么已经删除了一组括号,要么不需要删除,因为第一个元素没有包含在其中。

另外,遇到一个(将一个新符号推入堆栈,该符号模拟进入新级别,以及)从中弹出一个符号,该符号模拟从某一关卡离开的情况。所有输入字符都会附加到结果中except当。。。的时候BeforeInside and InsideDone发生转变。

下面的代码是将上面的代码简单翻译成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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号 的相关文章

  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 从表达式函数获取父属性

    假设我有以下课程 public class Model public AnotherModel InnerModel get set public class AnotherModel public String Value get set
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 根据列 value_counts 过滤数据框(pandas)

    我是第一次尝试熊猫 我有一个包含两列的数据框 user id and string 每个 user id 可能有多个字符串 因此会多次出现在数据帧中 我想从中导出另一个数据框 一个只有那些user ids列出至少有 2 个或更多string
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐

  • 如何解析代码(Python)?

    我需要解析一些特殊的数据结构 它们采用某种类似 C 的格式 大致如下所示 Group GroupName C Style comment Group AnotherGroupName Entry some variables 0 3 141
  • 是否可以列出派生 Generic 的记录数据类型中字段的名称和类型?

    我知道对于派生 Data Data 的数据类型 constrFields http hackage haskell org package base 4 7 0 2 docs Data Data html v constrFields给出字
  • Android - 使用 HttpURLConnection 来 POST XML 数据

    我遇到了一些死胡同 需要一些帮助 请 我对 Android 开发 以及一般编码 非常陌生 基本上我需要使用 HttpURLConnection 将 XML 数据发布到 URL 但无法让它工作 我的应用程序从 GET 请求读取并传递 XML
  • 用于 JAWS 开发的文本控制台?

    我正在开发一个网络应用程序 我希望通过屏幕阅读器使其易于使用 在 JAWS 中测试东西非常耗时 是否可以让 JAWS 显示文本而不是阅读它 我实际上不想听到开发过程中的内容 我只是想看看 JAWS 会读什么 据我所知 大白鲨 没有语音查看器
  • 使用两个图像的平方差作为张量流中的损失函数

    我正在尝试使用两个图像之间的 SSD 作为我的网络的损失函数 h fc2 is my output layer y is my label image ssd tf reduce sum tf square y h fc2 train st
  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • Spark Worker 在 Heartbeater 中与 Spark Driver 通信的超时时间为 3600 秒

    我没有配置任何超时值 而是使用默认设置 在哪里配置3600秒超时 怎么解决呢 错误信息 18 01 10 13 51 44 WARN Executor Issue communicating with driver in heartbeat
  • 添加一个favicon到redmine主题

    redmine 使用位于的 favicon usr share redmine public favicon ico 我发现很多代码片段使用cd usr share redmine grep HR favicon app app helpe
  • 单击时获取按钮值并回显它

    我是 php 的初学者 我的第一个任务是构建一个计算器 我在这里询问如何从按钮获取值并在同一页面上回显它 我正在尝试使用 isset 通过方法发布 但能够在同一页面上显示任何值
  • 在 C 中初始化结构体的静态数组

    我正在用 C 实现一个纸牌游戏 纸牌有很多种类型 每种纸牌都有大量信息 包括一些需要单独编写与其关联的脚本的操作 给定这样的结构 并且我不确定我的语法是否适合函数指针 struct CARD int value int cost This
  • GAE、JPA、XG 事务、实体组过多异常

    我知道 GAE 上的 XG 交易有 5 个实体组的限制 但我认为我在一项交易中仅使用 3 个组 商品 类别 商品类别 但仍然遇到此异常 引起原因 java lang IllegalArgumentException 在单个事务中对太多实体组
  • NuGet 未显示任何包

    I ve tried going to the URL listed for the official package source with my browser and I only get an empty list I also t
  • 带有隐藏输入的 Selenium 文件选择器[type=file]

    我有一个图像文件上传并想测试它硒 java 用户有两个选择 他可以通过从本地计算机拖放来推送图像 也可以单击 浏览 按钮 然后出现浏览器指定的文件选择器 In Selenium我尝试了不同的事情 据我所知Selenium不提供浏览器之外的操
  • 覆盖 vuetify 中的 scss 变量

    为了增加 vuetify 的 v switch 的宽度 我想修改 vuetify 的 scss 变量的值 vuetify是通过vue cli配置的 开发的代码如下 src assets css overrides scss font siz
  • Google 文档从脚本调用 ImportXML

    我在 google 文档表中使用 ImportXML 从 sistrix api 获取数据 它工作正常 但我遇到了一张纸中 50 个 ImportXML 命令的限制 因此 我使用了一个脚本 将 ImportXML 命令写入单元格 临时 公式
  • 在javascript中调用c#函数[重复]

    这个问题在这里已经有答案了 可能的重复 从 Javascript 调用 ASP NET 函数 https stackoverflow com questions 3713 call asp net function from javascr
  • Zend_Controller_Router_Route:找不到翻译器

    我正在开发一个多语言应用程序 在引导程序中有路由设置 protected function initRoutes this gt bootstrap frontController router this gt frontControlle
  • 使用 PrimarySearcher.FindAll() 时出现内存泄漏

    我也有一个使用插件和应用程序域长时间运行的服务 并且由于使用目录服务而出现内存泄漏 请注意 我正在使用 system directoryservices accountmanagement 但据我了解 它使用相同的底层 ADSI API 因
  • Spring WebFlux - 通过 webClient 转发 FilePart

    我浏览过类似的门票 即如何在 Spring WebFlux 中从 Multipart form data 流式传输文件 https stackoverflow com questions 70408075 how to stream fil
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周