我有一个音乐节奏的私人记号,例如-(---)-代表节拍,节拍,三连音,节拍。托架将单个节拍分成尽可能多的部分。
是递归的,例如-((-)(-))-的含义与-(----)-
相同[我正在尝试解析这样的字符串,并将它们转换为音符的持续时间,而在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]
解析似乎很容易完成实际工作:
import pyparsing
parsed=(pyparsing.nestedExpr().parseString("("+string+")").asList())[0]
['--', ['-', ['--']], '-', ['--', ['--']], '---', ['--'], ['-']]
但是要将其变成上面的树时,只需将字符串'-'替换为1,1,我试图编写递归并映射和连接列表,就像在lisp中一样,但是我只是被卡住了。
[谁能告诉我一种在python中做这种事情的好方法吗?轻快的风格是否容易解决,还是有一些聪明的事情需要发电机和理解力来代替?
我不确定我是否正确理解了您的问题。您是否要按照问题中的说明将pyparsing
的输出转换为树结构?如果是,则可以执行以下操作:
lst = ['--', ['-', ['--']], '-', ['--', ['--']], '---', ['--'], ['-']]
def convert(lst):
for item in lst:
if isinstance(item, str):
yield from (1 for i in item)
else:
yield [i for i in convert(item)]
print(list(convert(lst)))
打印:
[1, 1, [1, [1, 1]], 1, [1, 1, [1, 1]], 1, 1, 1, [1, 1], [1]]