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) и подготавливает его для сравнения, в последнем примере она формирует для сравнения список состоящий из поля объекта "пол" и поля "имя" с применением функции перевода строки в нижний регистр (иначе возможны не корректные сортировки)
текст недоступен
другие страницы раздела
- C/C++: Разбор параметров командной строки - unistd.h :: getopt
- С/C++: libconfig - библиотека для обработки конфигурационных файлов
- Python: strip split join
- jQuery: простые примеры
- python: работа со строками и словарями, формирование sql запросов
- Выбор платформы для презентаций
- Пакетная обработка DBF Foxpro файлов, Import в FoxPRO
- Расширение Firefox собственным Меню -- это очень просто
- Разработка открытой альтернативы закрытому отраслевому ПО "Архивный Фонд"
- Django использование select_related для оптимизации работы
- Linux Django pyodbc MSSQL
- Sqlite3 работа с несколькими базами
- python ProxyError
- Flask.admin FileAdmin проблема с локалями
- Flask restful сериализация sqlalchemy моделей в Json поток
комментарии