存储音符名称的最佳python数据类型是什么?
我希望它可以迭代,但有些笔记有其他名称。例如,C#(C sharp)与Db(D flat)的注释相同。如果我使用列表或元组,那么输入替代名称将“打破”迭代过程,我将无法找到一个音符,比如它上面的3个半音,只需查看距离初始音符3步的位置。 (我已经计算出%12以使其以'循环'方式运行)
理想情况下,我希望两个备选音符名称在“列表”中占据相同的位置(或者最好的日期类型),并且能够通过我调用它的方式指定我想要返回的名称。像notes.flats这样的东西。
实际上是否存在支持此类内容的数据类型,还是我看起来完全错误?我的下一个想法是上课。
答案 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。