… однако, если старты совпадают, мне нужен второй критерий для сортировки (если есть простой способ сделать это, то все решится)
Существует простой способ сделать это: использовать кортеж для ключа каждого элемента . Поскольку сравнение кортежей рассматривает более ранние элементы как более значимые, более поздние элементы рассматриваются только при совпадении более ранних.
Например, приведен список элементов с двумя числами, где сортировка должна выполняться по возрастанию по первому (более значимому) числу и по убыванию по второму:
>>> data = [
... (1, 0),
... (1, 1),
... (1, 2),
... (0, 0),
... (2, 0),
... ]
>>> data.sort(key=lambda (a, b): (a, -b))
>>> data
[(0, 0), (1, 2), (1, 1), (1, 0), (2, 0)]
Я забыл что-то важное. По второму критерию это не просто больший / меньший случай. Это по аналогии, если start == "конкретный", вернуть -1
Используйте ваши специальные значения в более поздних элементах кортежа таким образом, чтобы они превращались в простое сравнение <, == или>:
def ticket_key(ticket):
start = ticket["start"]
if start == "specific":
second = -1
else:
second = ticket["blah"]
return (start, second)
tickets.sort(key=ticket_key)
Теперь для элементов, где ticket ["start"] является "специфичным", вместо ticket ["blah"] используется -1:
>>> data = [
... {"start": "specific"}, # "blah" doesn't even exist here
... {"start": "specific", "blah": 2},
... {"start": "42", "blah": 1},
... {"start": "42", "blah": 0},
... ]
>>> data.sort(key=ticket_key)
>>> data
[{'start': '42', 'blah': 0},
{'start': '42', 'blah': 1},
{'start': 'specific'},
{'start': 'specific', 'blah': 2}]