如何根据存储在值中的列表的第n个条目返回已排序的键列表?

2024-06-26 14:46:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典,我正在存储音乐和弦的数据,以名称为键,以列表中的音调值为值。我想能够排序,如果在所包含的列表中的各种值的基础上。以下是数据示例:

chord_bank = {
        '7sus':[0,5,7,10],              # c           f    g      bb
        'maj7sus':[0,5,7,11],           # c           f    g         b
        'sus4':[0,5,7],                 # c           f    g        
        'maj':[0,4,7],                  # c         e      g
        'min':[0,3,7],                  # c      eb        g        
        'sus2':[0,2,7],                 # c    d           g
}

基本上,我只想提取列表的键,这很简单:

chords = [*chord_bank.keys()]
print(chords)

# ['7sus', 'maj7sus', 'sus4', 'maj', 'min', 'sus2']

但是我也希望能够对值列表中的给定项进行排序。例如:

chords = sorted(chord_bank.items(), key=lambda kv: kv[1][-1])
print(chords)

# [('sus4', [0, 5, 7]), ('maj', [0, 4, 7]), ('min', [0, 3, 7]), ('sus2', [0, 2, 7]), ('7sus', [0, 5, 7, 10]), ('maj7sus', [0, 5, 7, 11])]

这里的问题是,我得到的不是和弦名称列表,而是元组列表。我知道在我得到元组列表之后,我现在可以使用这样的理解,但是我试着看看是否可以在排序函数本身中完成这一点

我试过从herehereherehere中寻找可能的解决方案,我也试过像这样一些天真的解决方案,但以我预期的方式失败了:

chords = sorted(chord_bank, key=(chord_bank.get)[1])

# TypeError: 'builtin_function_or_method' object is not subscriptable

以及

chords = sorted(chord_bank.values(), key=lambda kv: kv[1][-1])

# TypeError: 'int' object is not subscriptable

因此,我正在寻找一个解决方案,可以直接返回一个键列表(和弦名称)排序在任何索引的值列表我选择


Tags: key名称列表here排序minbanksorted
1条回答
网友
1楼 · 发布于 2024-06-26 14:46:08
def sorted_cord_names(chord_bank: dict, index: int):
    return sorted(chord_bank.keys(), key=lambda key: chord_bank[key][index])

>>> chord_bank = {'7sus': [0, 5, 7, 10], 'maj7sus': [0, 5, 7, 11], 'sus4': [0, 5, 7], 'maj': [0, 4, 7], 'min': [0, 3, 7], 'sus2': [0, 2, 7]}
>>> sorted_cord_names(chord_bank, -1)
['sus4', 'maj', 'min', 'sus2', '7sus', 'maj7sus']

相关问题 更多 >