Python: сортировка списков

Предположим у вас есть список объектов с различными атрибутами, и вам необходимо отсортировать их этот список по нужному вам критерию, для этого вам необходимо воспользовать встроенной в списки функцией .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
Нужна авторизация с помощью
Об авторе
Илья Илья

меня можно найти тут