все Python 3Списки (list)понятие
Сортировка ключом key= / lambda
сортировка
key= принимает функцию, возвращающую значение для сравнения. lambda удобна для однострочных ключей.
Синтаксис
sorted(lst, key=func) | lst.sort(key=lambda x: ...)
Функция из key= вызывается ровно один раз для каждого элемента, а не на каждое сравнение, поэтому даже не самый дешёвый ключ обходится терпимо. Сортировка стабильна: элементы с одинаковым ключом сохраняют исходный порядок — на этом строится сортировка по нескольким полям несколькими проходами, от менее значимого поля к более значимому (reverse=True стабильность не ломает). Классическая ошибка — написать key=len() вместо key=len: передавать надо саму функцию, а не результат её вызова.
Примеры
words = ['banana', 'apple', 'fig', 'cherry']
print(sorted(words, key=len))
# → ['fig', 'apple', 'banana', 'cherry']
pairs = [(2, 'b'), (1, 'c'), (3, 'a')]
print(sorted(pairs, key=lambda x: x[1]))
# → [(3, 'a'), (2, 'b'), (1, 'c')]
print(sorted(pairs, key=lambda x: x[0], reverse=True))
# → [(3, 'a'), (2, 'b'), (1, 'c')]
people = [('Alice', 30), ('Bob', 25), ('Carol', 30)]
print(sorted(people, key=lambda p: (p[1], p[0])))
# → [('Bob', 25), ('Alice', 30), ('Carol', 30)]
nums = ['-3', '1', '-10', '2']
print(sorted(nums, key=lambda x: abs(int(x))))
# → ['1', '2', '-3', '-10']
strs = ['Banana', 'apple', 'Cherry']
print(sorted(strs, key=str.lower))
# → ['apple', 'Banana', 'Cherry']
from operator import itemgetter
data = [{'name': 'b', 'val': 2}, {'name': 'a', 'val': 3}]
print(sorted(data, key=itemgetter('name')))
# → [{'name': 'a', 'val': 3}, {'name': 'b', 'val': 2}]
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности