Python-如何按照指定的属性顺序对对象数组进行双重排序?

Gia*_*nna 5 python sorting list

我有一堂课

class Challenge():
  difficulty = Field(type=float)
  category = Field(type=str)
Run Code Online (Sandbox Code Playgroud)

我有一个想以自定义方式排序的Challenge对象的列表:我想按自定义顺序对难度进行排序,然后针对每个难度,我要按类别对对象进行排序,每个难度都按不同的自定义顺序进行排序困难。

我已经有一个字典,其中按顺序列出了难度,对于每个难度,则列出了类别的排序。我需要将此排序应用于列表,但我不知道如何将这些条件应用于排序。

我到了这一点:

found_challenges.sort(key=lambda x: (x.difficulty, x.category))
Run Code Online (Sandbox Code Playgroud)

显然,这不是按照我想排序的方式排序。如何将这些自定义条件应用于列表排序?

例:

ch_1 = Challenge(difficulty=1.0, category='one')
ch_2 = Challenge(difficulty=1.0, category='two')
ch_3 = Challenge(difficulty=2.0, category='one')
ch_4 = Challenge(difficulty=2.0, category='two')
Run Code Online (Sandbox Code Playgroud)

而订购字典是

{
   2.0: ['one', 'two'],
   1.0: ['two', 'one']
}
Run Code Online (Sandbox Code Playgroud)

因此排序应为:

[ch_3, ch_4, ch_2, ch_1]
Run Code Online (Sandbox Code Playgroud)

kab*_*nus 2

差不多了:

found_challenges.sort(key=lambda x: (-x.difficulty, ordering_dict[x.difficulty].index(x.category)))
Run Code Online (Sandbox Code Playgroud)

所以第二个键是各个难度列表中类别的索引。如果你想颠倒顺序,只需添加一个-符号即可。

如果您的困难不仅仅是单调的,请注意字典中键的顺序。您只能依赖 Python 3.7 中的插入顺序。在以前的版本中,如果您想对键建立索引,则需要一个OrderedDict.

  • 完毕!我还必须尊重 `ordering_dict` 字典键的插入顺序,所以我以这种方式实现了我的目的: `found_challenges.sort(key=lambda x: (list(ordering_dict.keys()).index(x .difficulty), ordering_dict[x.difficulty].index(x.category.value)))` (2认同)