Python 如何对音高/倍频程对进行排序

Python 如何对音高/倍频程对进行排序,python,sorting,Python,Sorting,我有一个音高和八度对的列表,我想按升序或降序排序: [['G', 2], ['D', 3], ['B', 3], ['A', 3], ['B', 3], ['D', 3], ['B', 3]] 应首先对倍频程值进行排序。这很容易,因为八度是整数值。 我的问题是,在按八度排序之后,我不知道如何按音高排序。 顺序为(从最低到最高音高): 我认为用python在一行中就可以做到这一点,但我甚至不知道如何在100行中做到这一点;) 任何帮助都将不胜感激, 谢谢我认为最干净的方法是定义自定义键函数: &

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

[['G', 2], ['D', 3], ['B', 3], ['A', 3], ['B', 3], ['D', 3], ['B', 3]]
应首先对倍频程值进行排序。这很容易,因为八度是整数值。 我的问题是,在按八度排序之后,我不知道如何按音高排序。 顺序为(从最低到最高音高):

我认为用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]]

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

否。h只是德语符号,这意味着说德语的人将使用B的h instad。我想提供此信息。也许这会让事情变得更复杂!我会删除它欢迎来到这个网站!到目前为止你试过什么?Python 2还是Python 3?查看更多关于写作问题的信息,这些问题将吸引高质量的答案。巴赫!是的,J.S.B.!!:)我使用Python3从xml文件中提取值,得到了一个类似于上面的列表。它只是有更多的价值。我可以在这里发布我的代码,但我认为这不会有多大帮助。。。我想我在理解如何使用我的投球列表作为排序顺序时忽略了一个基本点。@nodFlindors没关系,你可以保留H。我只给它与B相同的值。@msw我认为这个问题比dupe目标更具体。OP还需要为他的信件定义一个自定义顺序,而不是使用字典顺序。好的。这似乎正是我想要的。我将深入研究文档,这样我就可以在这里真正学到一些东西,并在我的列表中尝试一下,然后报告回来!非常感谢:)@nodFlindors没问题,考试结束后再报告。请解释投票结果并告诉我更好的方法。谢谢。谢谢,这正是我想要的,它帮助我更多地理解python。我还认为这个问题澄清了如何使用自定义排序顺序。
>>> 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]]