This question already has answers here:
How to sort (list/tuple) of lists/tuples by the element at a given index?
                                
                                    (10个回答)
                                
                        
                                4年前关闭。
            
                    
我有一个音高和八度对的列表,我想对它们进行升序或降序排序:

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


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

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


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

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

最佳答案

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

>>> 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]]


这将首先按整数值排序,然后按音高(字母)排序。

10-07 13:30