Руководство по сортировке списка Python по двум условиям.

Иногда нам может понадобиться отсортировать список по двум условиям. Например, допустим, нам нужно отсортировать список строк по длине, а затем по количеству букв a внутри строки.
lis = ["apple", "pear", "aaaaa", "aaaa", "baaaa", "baaa"]
Строки меньшей длины идут впереди, а если 2 строки одинаковой длины, то впереди идет та, в которой меньше букв a. Что мы хотим:
lis = ["pear", "baaa", "aaaa", "apple", "baaaa", "aaaaa"]
length num_a
pear 4 1
baaa 4 3
aaaa 4 4
apple 5 1
baaaa 5 4
aaaaa 5 5
Сортировка списков с помощью функции
Чтобы сообщить Python, что мы хотим отсортировать список по двум условиям, нам нужно написать для этого функцию. Я назову свою функцию condition, но вы можете назвать ее как хотите.
def condition(element):
return len(element), element.count("a")
Наша функция condition должна принимать 1 элемент, который представляет 1 элемент в списке, который мы хотим отсортировать. Затем наша функция возвращает 2 балла (разделенных) запятыми, по которым мы хотим отсортировать наш список.
length num_a
pear 4 1 condition("pear") -> (4,1)
baaa 4 3 condition("baaa") -> (4,3)
aaaa 4 4 condition("aaaa") -> (4,4)
apple 5 1 condition("apple") -> (5,1)
baaaa 5 4 condition("baaaa") -> (5,4)
aaaaa 5 5 condition("aaaaa") -> (5,5)
В приведенной выше таблице обратите внимание на оценки, которые генерируются, когда мы передаем каждый элемент в condition.
lis.sort(key=condition)
Если мы вызовем метод .sort с key=condition, наш список будет отсортирован по этой оценке, сгенерированной функцией condition. Чтобы быть более конкретным, элементы в нашем списке сортируются по первому номеру в списке (длина), а затем по второму номеру в списке (число a).
pear -> (4,1) baaa -> (4,3) aaaa -> (4,4) apple -> (5,1) baaaa -> (5,4) aaaaa -> (5,5) lis -> ["pear", "baaa", "aaaa", "apple", "baaaa", "aaaaa"]
Сортировка списков с помощью лямбда-функции
Лямбда-функция — это функция, которую можно записать в одну строку, и нам не нужно давать ей имя. Давайте сначала перепишем нашу функцию condition, используя x вместо element, так как она занимает меньше букв:
def condition(x):
return len(x), x.count("a")
Синтаксис лямбды:
optional_function_name = lambda inputs: output
Написание той же самой функции с использованием лямбда-синтаксиса:
condition = lambda x: len(x), x.count("a")
Сортируем наш список (длинный путь):
condition = lambda x: len(x), x.count("a")
lis.sort(key=condition)
Сортировка нашего списка в одной строке без указания имени нашей функции:
lis.sort(key=lambda x: len(x), x.count("a"))
Выше показано, как мы обычно сортируем вещи по нескольким условиям в Python.
pear -> (4,1) baaa -> (4,3) aaaa -> (4,4) apple -> (5,1) baaaa -> (5,4) aaaaa -> (5,5) lis -> ["pear", "baaa", "aaaa", "apple", "baaaa", "aaaaa"]
Сортировка списков по более чем 2 условиям
Допустим, у нас есть огромный список словарей, и каждый словарь представляет студента:
students = [
{"name": "Ace", "A": 4, "B": 2, "C": 2, "D": 0},
{"name": "Bob", "A": 4, "B": 3, "C": 1, "D": 1},
{"name": "Cat", "A": 4, "B": 3, "C": 2, "D": 0},
...
]
Каждый учащийся имеет несколько оценок A, B, C и так далее. Некоторые студенты изучают больше предметов, чем другие. Допустим, мы хотим отсортировать students по 1. количеству As 2. количеству B 3. количеству Cs 4. количеству Ds.
- Сначала мы сортируем студентов по количеству As.
- Для тех, у кого одинаковое количество «А», мы сортируем их по количеству «Б».
- Для тех, у кого одинаковое количество А и В, мы сортируем их по количеству В
- Для тех, у кого одинаковое количество А, В и С, мы сортируем их по количеству D.
Функция условия, которую нам нужно написать + Сортировка нашего списка:
def condition(x):
return x["A"], x["B"], x["C"], x["D"]
students.sort(key=condition)
Напишите это в одну строку, используя лямбда-функцию:
students.sort(key=lambda x: x["A"], x["B"], x["C"], x["D"])
Несколько заключительных слов
И это, дамы и господа, как мы можем отсортировать список по 2 или более условиям. Надеюсь, это было полезно и понятно!
Заключение
Я пишу статьи по программированию (раз в 1–2 дня), которые, вероятно, помогли бы мне в более молодом возрасте ускорить процесс обучения. Присоединяйтесь к моему списку адресов электронной почты, чтобы получать уведомления о каждой публикации.
Если эта статья была полезной и вы хотите поддержать меня, подумайте о том, чтобы подписаться на членство в Medium — это стоит 5 долларов в месяц, и вы получаете неограниченный доступ к статьям на Medium. Если вы зарегистрируетесь по моей ссылке ниже, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.