Предположим у вас есть список объектов с различными атрибутами, и вам необходимо отсортировать их этот список по нужному вам критерию, для этого вам необходимо воспользовать встроенной в списки функцией .sort с параметром key
Например, у меня в базе есть список людей репрессированных за всякие нехорошие делишки, среди всех атрибутов этих людей меня интересуют пол и имена:
for a in rl:print a.id, a.sex, a.first_name ... 1551987 1 Виктория 2212644 1 Клавдия 2212647 1 Валентина 2214814 2 Павел 2223472 1 Владислава 2223482 2 Павел 2227653 1 Марина 2227682 2 Николай 2227757 2 Саша 2227844 2 Николая 2228553 2 Алекс 2228608 1 Екатерина 2228657 2 Максим 2228692 2 Роман 2228748 2 Василий-Дмитриевич 2230327 2 Михаил 2232569 2 Анатолий 2232829 1 Анастасия 2233073 2 Максим 2233087 1 Инга 2233098 2 Владимир 2234717 2 Фёдор 2235549 1 Марина 2235552 2 Яросав 2235850 2 Рустам 2239743 2 Пётр 2239766 1 Мария 2239785 1 Юлия 2240058 2 Николай 2240658 2 Максим 2240722 2 Евгений
Допусти мне нужно отсортировать список по полу, а затем по имени и для этого я использую следующий ключ
rl.sort(key = lambda x: x.sex) for a in rl:print a.id, a.sex, a.first_name ... 2232829 1 Анастасия 2212647 1 Валентина 1551987 1 Виктория 2223472 1 Владислава 2228608 1 Екатерина 2233087 1 Инга 2212644 1 Клавдия 2227653 1 Марина 2235549 1 Марина 2239766 1 Мария 2239785 1 Юлия 2228553 2 Алекс 2232569 2 Анатолий 2228748 2 Василий-Дмитриевич 2233098 2 Владимир 2240722 2 Евгений 2228657 2 Максим 2233073 2 Максим 2240658 2 Максим 2230327 2 Михаил 2227682 2 Николай 2240058 2 Николай 2227844 2 Николая 2214814 2 Павел 2223482 2 Павел 2239743 2 Пётр 2228692 2 Роман 2235850 2 Рустам 2227757 2 Саша 2234717 2 Фёдор 2235552 2 Яросав
rl.sort(key = lambda x: x.first_name) for a in rl:print a.id, a.sex, a.first_name ... 2228553 2 Алекс 2232829 1 Анастасия 2232569 2 Анатолий 2212647 1 Валентина 2228748 2 Василий-Дмитриевич 1551987 1 Виктория 2233098 2 Владимир 2223472 1 Владислава 2240722 2 Евгений 2228608 1 Екатерина 2233087 1 Инга 2212644 1 Клавдия 2228657 2 Максим 2233073 2 Максим 2240658 2 Максим 2227653 1 Марина 2235549 1 Марина 2239766 1 Мария 2230327 2 Михаил 2227682 2 Николай 2240058 2 Николай 2227844 2 Николая 2214814 2 Павел 2223482 2 Павел 2239743 2 Пётр 2228692 2 Роман 2235850 2 Рустам 2227757 2 Саша 2234717 2 Фёдор 2239785 1 Юлия 2235552 2 Яросав
Думаю тут всё очевидно, но ещё интереснее когда нужна сортировка по нескольким полям, для этого расширяем ключ сортировки вот так:
rl.sort(key = lambda x: [x.sex,x.first_name.lower()]) for a in rl:print a.id, a.sex, a.first_name ... 2232829 1 Анастасия 2212647 1 Валентина 1551987 1 Виктория 2223472 1 Владислава 2228608 1 Екатерина 2233087 1 Инга 2212644 1 Клавдия 2227653 1 Марина 2235549 1 Марина 2239766 1 Мария 2239785 1 Юлия 2228553 2 Алекс 2232569 2 Анатолий 2228748 2 Василий-Дмитриевич 2233098 2 Владимир 2240722 2 Евгений 2228657 2 Максим 2233073 2 Максим 2240658 2 Максим 2230327 2 Михаил 2227682 2 Николай 2240058 2 Николай 2227844 2 Николая 2214814 2 Павел 2223482 2 Павел 2239743 2 Пётр 2228692 2 Роман 2235850 2 Рустам 2227757 2 Саша 2234717 2 Фёдор 2235552 2 Яросав
Вот такой вот классный Python, здесь фишка в том, что функция sort получает функцию которая получает сравниваемый объект(x) и подготавливает его для сравнения, в последнем примере она формирует для сравнения список состоящий из поля объекта "пол" и поля "имя" с применением функции перевода строки в нижний регистр (иначе возможны не корректные сортировки)
Комментариев 0