python - 如何在 python 中处理解析和树处理任务? (代表节奏)

标签 python parsing expression-trees

我有一个音乐节奏的私有(private)符号,看起来像,例如--(---)- 节拍、节拍、三连音、节拍。括号将单个节拍分成其包含的多个部分。

它是递归的,所以例如--((--)(--))- 与 --(----)- 含义相同

我正在尝试解析这些字符串并将它们转换为音符时长,但我发现在 python 中它非常困难。

一个例子应该是这样的:

string="--(-(--))-(--(--))---(--)(-)"
->
tree=[1,1,[1,[1,1]],1,[1,1,[1,1]],1,1,1,[1,1],[1]]
->
inversedurations= [1,1,2,4,4,1,3,3,6,6,1,1,1,2,2,1]

pyparsing 似乎很容易完成实际的困难:

import pyparsing
parsed=(pyparsing.nestedExpr().parseString("("+string+")").asList())[0]

['--', ['-', ['--']], '-', ['--', ['--']], '---', ['--'], ['-']]

但是当涉及到将其转换为上面的树时,只需将字符串“--”替换为 1,1 我正在尝试像在 lisp 中那样编写递归、映射和连接列表,但我只是陷入困境。

谁能告诉我一种在 python 中做这些事情的好方法吗? lisp 风格是否很容易通过,或者是否可以用生成器和推导式来做一些聪明的事情?

最佳答案

我不确定我是否正确理解了您的问题。您是否想将 pyparsing 的输出转换为问题中所述的树结构?如果是,你可以这样做:

lst = ['--', ['-', ['--']], '-', ['--', ['--']], '---', ['--'], ['-']]

def convert(lst):
    for item in lst:
        if isinstance(item, str):
            yield from (1 for i in item)
        else:
            yield [*convert(item)]

print(list(convert(lst)))

打印:

[1, 1, [1, [1, 1]], 1, [1, 1, [1, 1]], 1, 1, 1, [1, 1], [1]]

关于python - 如何在 python 中处理解析和树处理任务? (代表节奏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58999405/

相关文章:

python - 如何解析子流程的结果

python - 在python中解析单词列表

c# - Entity Framework Core LINQ 树表达式问题与 Concat

c# - 如何使用 F# lambda 创建 Linq 表达式树?

python - Django 管理员在添加/编辑表单中管理外键

python - 在 Python Tkinter GUI-PY_VAR21 错误中使用 DataFrame 的多个动态选项菜单

python - 如何将字典转换为元组列表?

jquery 解析大括号内的文本

python - 通过 python 的 matplotlib.pyplot.contourf 分散 x,y,z

c# - 从 Expression<Func<T, object>> 实例获取实际返回类型