【问题标题】:Python - How to double sort an array of objects following a specified order of the attributes?Python - 如何按照指定的属性顺序对对象数组进行双重排序?
【发布时间】:2019-10-08 08:46:10
【问题描述】:

我有这种类型的课程

class Challenge():
  difficulty = Field(type=float)
  category = Field(type=str)

我有一个挑战对象列表,我想以自定义方式排序:我想使用自定义顺序按难度排序,然后每个难度我想按类别对对象进行排序,使用不同的自定义按每个难度排序。

我已经有一个字典,键是有序的困难,每个困难都有有序的类别列表。我需要将此排序应用于我的列表,但我不知道如何将这些条件应用于排序。

我达到了这一点:

found_challenges.sort(key=lambda x: (x.difficulty, x.category))

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

例子:

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')

排序字典是

{
   2.0: ['one', 'two'],
   1.0: ['two', 'one']
}

所以顺序应该是:

[ch_3, ch_4, ch_2, ch_1]

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    差不多了:

    found_challenges.sort(key=lambda x: (-x.difficulty, ordering_dict[x.difficulty].index(x.category)))
    

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

    如果您的困难不仅仅是单调的,请注意The order of keys in dictionaries。您只能依赖 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)))
    猜你喜欢
    • 2018-02-07
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2019-11-21
    • 2018-04-19
    相关资源
    最近更新 更多