如何对Pitch / Octave对进行排序

时间:2016-02-06 13:27:52

标签: python sorting

我有一个音高和八度音阶对的列表,我想按升序或降序排序:

[['G', 2], ['D', 3], ['B', 3], ['A', 3], ['B', 3], ['D', 3], ['B', 3]]

首先应对八度值进行排序。这很简单,因为八度音程是整数值。 我的问题是,我不知道如何按八度音程排序后按音调排序。 顺序是(从最低到最高的音高):

C, D, E, F, G, A, B 

我认为可以在python的一行中做到这一点,但我甚至不知道如何在100行中做到这一点;)

任何帮助将不胜感激, 感谢

1 个答案:

答案 0 :(得分:1)

我认为最干净的方法是定义自定义键功能:

>>> lst = [['G', 2], ['D', 3], ['B', 3], ['A', 3], ['B', 3], ['D', 3], ['B', 3]]
>>> pitch_order = {'C': 0, 'D': 1, 'E': 2, 'F': 3, 'G': 4, 'A': 5, 'B': 6, 'H': 6}    
>>> keyfun = lambda pair: (pair[1], pitch_order[pair[0]])
>>> sorted(lst, key=keyfun)
[['G', 2], ['D', 3], ['D', 3], ['A', 3], ['B', 3], ['B', 3], ['B', 3]]

首先按整数值排序,然后按间距(字母)排序。