如何在 python 中处理解析和树处理任务? (代表节奏)
How do I approach parsing and tree processing tasks in python? (representing rhythm)
我有一个音乐节奏的私人符号,看起来像,例如--(---)- 节拍、节拍、三连音、节拍。括号将单个节拍分成与它们包含的部分一样多的部分。
它是递归的,所以例如--((--)(--))- 等同于--(----)-
我正在尝试解析此类字符串并将它们转换为音符时值,但我发现 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 中的操作出奇地困难。
一个例子应该是这样的:
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]]