Как отсортировать список кортежей сразу по нескольким ключам (например, по фамилии, потом по возрасту)?
Есть список кортежей [('Иванов', 25), ('Петров', 20), ('Иванов', 19)]. Хочу отсортировать сначала по фамилии (по алфавиту), а при равной фамилии — по возрасту по возрастанию. Как это сделать одним вызовом?
2 ответа
Верни из key кортеж — Python сравнивает кортежи поэлементно, поэтому сортировка по нескольким ключам получается автоматически:
data = [('Иванов', 25), ('Петров', 20), ('Иванов', 19)]
result = sorted(data, key=lambda x: (x[0], x[1]))
print(result)
# [('Иванов', 19), ('Иванов', 25), ('Петров', 20)]
Если по одному из ключей нужен обратный порядок, а по другому — прямой, для чисел можно поставить минус: key=lambda x: (x[0], -x[1]). sorted стабильна, так что для строк, где минус не поставишь, иногда сортируют в два прохода — сначала по второстепенному ключу, потом по главному.
Тут даже lambda не обязательна — кортеж уже сравнивается как надо, можно sorted(data). Но как только ключи не в том порядке, в каком лежат поля, lambda нужна.