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

问题描述 投票:3回答:1

我有一个音乐节奏的私人记号,例如-(---)-代表节拍,节拍,三连音,节拍。托架将单个节拍分成尽可能多的部分。

是递归的,例如-((-)(-))-的含义与-(----)-

相同

[我正在尝试解析这样的字符串,并将它们转换为音符的持续时间,而在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中做这种事情的好方法吗?轻快的风格是否容易解决,还是有一些聪明的事情需要发电机和理解力来代替?

python parsing expression-trees
1个回答
0
投票

我不确定我是否正确理解了您的问题。您是否要按照问题中的说明将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]]
© www.soinside.com 2019 - 2024. All rights reserved.