Руководство по сортировке списка 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. Если вы зарегистрируетесь по моей ссылке ниже, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.

Зарегистрируйтесь, используя мою ссылку здесь, чтобы читать неограниченное количество статей на Medium.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.