存储音符名称的最佳python数据类型是什么?

时间:2017-09-17 14:09:35

标签: python

存储音符名称的最佳python数据类型是什么?

我希望它可以迭代,但有些笔记有其他名称。例如,C#(C sharp)与Db(D flat)的注释相同。如果我使用列表或元组,那么输入替代名称将“打破”迭代过程,我将无法找到一个音符,比如它上面的3个半音,只需查看距离初始音符3步的位置。 (我已经计算出%12以使其以'循环'方式运行)

理想情况下,我希望两个备选音符名称在“列表”中占据相同的位置(或者最好的日期类型),并且能够通过我调用它的方式指定我想要返回的名称。像notes.flats这样的东西。

实际上是否存在支持此类内容的数据类型,还是我看起来完全错误?我的下一个想法是上课。

3 个答案:

答案 0 :(得分:2)

列表清单怎么样:

notes = [['F','F#','G','G#','A','A#','B','C','C#','D','D#','E'],['F','F#','G','G#','A','A#','B','C','C#','D','D#','E']]

print(notes[0][1], notes[1][1])

两者都会返回F#

答案 1 :(得分:1)

Dictionary听起来很适合你。

您可以将字典的每个元素与允许您访问它的键相关联。

看起来像这样:

{ "C#":"Db", ... }

你可以像这样迭代字典:

for key in dictionary:
    print key                # will access the element to the left of :
    print dictionary[key]    # will access the element to the right of :

希望有所帮助!

答案 2 :(得分:1)

将您的内部表示 - 您的代码使用的内容 - 与外部代码分开 - 用户看到的内容。注释名称对于人们来说很好,而不是对程序而言。

内部代表:八度音中有十二个音符,因此将音符存储为数字0到11。

现在您需要在内部和外部表示之间进行转换的功能。一个用于将音符名称转换为音符编号,另一个用于反转。

def parse_note_name(note_name):
    ...
    return note_number

def to_note_name(note_number, symbol='#'):
    ...
    return note_name

这些可能是两种方法的签名。第一个解析音符名称,如C♯或D♭,并返回0到11之间的数字。第二个将数字0-11转换为音符名称。由于笔记有多个和谐名称,因此可以使用symbol之类的参数来控制是否返回锐利或平面。

您可以通过列出所有21种音符名称(七种自然,七种清晰,七种平面)来实现名称解析。一个更聪明的实现将首先处理该字母,然后是符号:将字母转换为注释编号,然后如果有,则添加1;如果有a减1。