【问题标题】:How do I approach parsing and tree processing tasks in python? (representing rhythm)如何在 python 中处理解析和树处理任务? (代表节奏)
【发布时间】: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


    【解决方案1】:

    我不确定我是否正确理解了您的问题。您想将输出从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]]
    

    【讨论】:

    • 太漂亮了,谢谢!我知道我应该使用生成器,但我就是无法让它工作。我在这里的同一篇文章中愚蠢地问了两个问题,所以在接受你的回答之前,我会等着看会发生什么。我现在甚至可以自己做下半场。但这就是我想要的。谢谢!
    猜你喜欢
    • 2016-08-07
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2018-10-31
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多