【发布时间】:2019-11-22 17:53:23
【问题描述】:
我有一个音乐节奏的私人符号,例如, --(---)- 表示节拍、节拍、三连音、节拍。括号将单个节拍分成与其包含的部分一样多的部分。
它是递归的,例如--((--)(--))- 意思与--(----)- 相同-
我正在尝试解析这些字符串并将它们转换为音符时长,我发现它在 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 风格是否容易过时,或者是否有一些聪明的事情可以用生成器和推导来代替?
【问题讨论】:
标签: python parsing expression-trees