gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:50:49 26 4
gpt4 key购买 nike

我有一个音乐节奏的私有(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com