Как дважды сортировать массив объектов, следуя указанному порядку атрибутов? - PullRequest
5 голосов
/ 08 октября 2019

У меня есть класс этого типа

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

, и у меня есть список объектов Challenge, которые я хочу отсортировать по-своему: я хочу упорядочить по сложности с помощью пользовательского заказа, а затемдля каждой сложности я хочу отсортировать объекты по категориям, с разным индивидуальным порядком для каждой сложности.

У меня уже есть диктовка с ключами упорядоченных трудностей и для каждой сложности упорядоченный список категорий. Мне нужно применить этот порядок к моему списку, и я не знаю, как применить эти критерии к сортировке.

Я достиг этой точки:

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]

1 Ответ

2 голосов
/ 08 октября 2019

Почти там:

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

Таким образом, второй ключ - это индекс категории в соответствующем списке сложности. Если вы хотите изменить порядок в этом, просто добавьте знак -.

Если ваши трудности не просто монотонны, обратите внимание Порядок ключей в словарях . Вы можете зависеть только от порядка вставки из Python 3.7. В предыдущих версиях, если вы хотите проиндексировать ключи, вам нужен OrderedDict.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...