← Все вопросы

Как отсортировать список кортежей сразу по нескольким ключам (например, по фамилии, потом по возрасту)?

Задан 17 месяцев назад541 просмотров2 ответа
12

Есть список кортежей [('Иванов', 25), ('Петров', 20), ('Иванов', 19)]. Хочу отсортировать сначала по фамилии (по алфавиту), а при равной фамилии — по возрасту по возрастанию. Как это сделать одним вызовом?

2 ответа

21
✓ Принятый ответ — помог автору

Верни из 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 стабильна, так что для строк, где минус не поставишь, иногда сортируют в два прохода — сначала по второстепенному ключу, потом по главному.

Вячеслав Алексеев Трюк с двумя проходами реально выручает, когда нельзя через минус · 17 месяцев назад
Сергей Новоселов Спасибо, про стабильность не знал · 17 месяцев назад
5

Тут даже lambda не обязательна — кортеж уже сравнивается как надо, можно sorted(data). Но как только ключи не в том порядке, в каком лежат поля, lambda нужна.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект