Пройденный материал
November 16, 2022

Аргумент key для сортировки

Основной источник - https://telegra.ph/CHetvertyj-blok-11-07

А так же сортировка различных коллекций, сортировка по двум критериям, немного нового о split(), и ввод до стоп слова с циклом while и без него (при помощи итератора), Работа со словарем (добавить элементы если ключ уже существует), считывание списка из входного потока, сортировать каждый рядок списка при помощи enumerate, метод Counter


Что научился:

Пронумеровать строку и сделать словарем

Лучше указать range(len(s))

Если у нас есть значения (в данном примере звания и нам нужно указать их порядок цифрой то используем zip + split)

Считывание списка из входного потока

То есть аналог input + while по завершению ctrl-D

Мы можем вводить значения с клавиатуры, которые добавятся в список

Из списка, состоящего из парных значений:

Сортировать каждый рядок в нужном порядке при помощи enumerate

Здесь на каждой итерации person_data изменяется и мы все эти изменения добавляем в список

https://stepik.org/lesson/567077/step/5?unit=561351 - ссылка на задание

Сортировать входные данные по значению словаря

https://stepik.org/lesson/567077/step/6?thread=solutions&unit=561351 - ссылка на задание

Или без превращения в словарь используя метод index

Так как наши элементы order уже отсортированы, их индексы начинаются с 0

И указываем что сортируем по этому индексу

(Тут происходит вот что, первая строка ['Балакирев', 'рядовой'] подставляется на lambda x, потом ее второе значения 'рядовой' подставляется order.index(x[сюда]) тем самым проверяя индекс этого слова в order, нашло это слово и вернуло его индекс)

Ввод с клавиатуры до стоп слова, после добавляем ключ - значение в словарь, если ключ повторяется то значения этого ключа записываются в один и тот же ключ

Метод через iter

Метод через while

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

Видим только два результата вместо 3

Тут мы проверяем условие, есть ли ключ в нашем словаре, если нет создаем его, а а если он уже есть то дописываем в него значения +=

Делаем это правильно:

Если ключа нет, то создаётся пустой список, потом конкатенация со значением Если ключ есть - возвращается значение списка и опять конкатенация со значением

К get нельзя применять .append()

К Setdefault можно

Setdefault записывает значение по умолчанию, если нет ключа в словаре, а get только возвращает значение по умолчанию, но не записывает

Поэтому мы не можем записать .append() к get

Запись идёт здесь

d[name]=

Метод с Setdefault

10.7 Сортировка по ключу Python. Аргумент key (https://stepik.org/lesson/372111/step/9?thread=solutions&unit=359665)

Если хоти еще и отсортировать по имени:

print(*sorted(d.get(month, ['Нет данных'])))

Посчитать сколько раз встретился элемент при помощи Counter и далее, из этого словаря сделать кортеж метод .most_common(), вывести определенные элементы из него

Или можно найти минимальное и максимальное значение

При помощи итератора (Возвращает элементы из функции, пока не получим из нее элемент совпадающий с 'конец')

Когда у нас строка, то split() нужно именно к ней применять

Чтоб такого не было:

Ну и повторил разбитие строки по разделителю

Сортировка списка из кортежей по второму значению

Сортировка по убыванию (Можно так-же использовать метод reverse = True),

" - " работает только для чисел

Сортировка по двум критериям (тут важно сделать кортеж). Сперва сортируется по первому критерию, если он одинаковый то уже по второму

Можно указать сколько попадет элементов при сортировке [:4] срезом

Сортировка строки по числам (когда это не кортеж а чисто строка)

Важно возвращать целое число в двух вариантах !!!

Второй вариант когда числа стоят через пробел

Тоже самое только с учетом регистра и если цифры одинаковые то по строкам

Сортировка по четному / не четному и по возрастанию

Различные методы сортировки словаря

  1. Сортировка только по значению
  2. Сортировка по значению и ключу (то есть если у нас значения одинаковые, будет сортировка по ключу)
  3. Сортировка по ключу
  4. Сортировку по ключу и значению (то есть если у нас есть одинаковые ключи, будет сортировка по значению)

Метод: сортировка по значению (при таком методе у нас выведется пара ключ-значение)

for i in sorted(heroes.items(), key=lambda x: x[1]):
    print(i)

Если мы хотим видеть только ключ или значение, то указываем это при выводе в квадратных скобках

for i in sorted(heroes.items(), key=lambda x: x[1]):
    print(i[1])  # print(i[2])

Также вместо .items() можно использовать метод get

Нюанс в том что мы не указываем lambda (можно и с ней)

Так как мы не указываем .items(), то по стандарту в heroes попадают наши ключи, key=heroes.get проверяет есть ли ключ и выдает значение, то есть сортировка будет по значению, но в нашу переменную i попадает именно ключ

for i in sorted(heroes, key=heroes.get):
    print(i)

Если хотим вывести только значения указываем это в принте

for i in sorted(heroes, key=heroes.get):
    print(heroes[i])

Метод: сортировка по значению и если значения одинаковые, то сортировка по ключу

Не забываем про кортеж

for i in sorted(heroes.items(), key=lambda x: (x[1], x[0])):
    print(i)

Так же без указания .items():

У нас в heroes попадает ключ, говорим что сортируем по значению, а потом по ключам

for i in sorted(heroes, key=lambda x: (heroes[x], x)):
    print(i, heroes[i])

Еще метод через get но с указанием lambda

Он довольно сложен в записи, по моему лучше использовать 1-2

for i in sorted(heroes, key=lambda x: (heroes.get(x), x)):
    print(i)

Метод: сортировка по ключу

for i in sorted(heroes.items(), key=lambda x: x[0]):
    print(i)

Метод: сортировка по ключу и значению

for i in sorted(heroes.items(), key=lambda x: (x[0], x[1])):
    print(i)

Примеры на практике

Необходимо на основе этих данных сформировать словарь и, затем, на основе этого словаря сформировать список предметов по убыванию их веса. (В списке должны находиться только наименования предметов без их весов).

С использованием цикла while

Второй способ с помощью оператора :=

При помощи итератора

Сортировать не через enumirate а через zip + sort

Тут происходит следующее:

Проходимся циклом по нашему списку lst_in и добавляем поочередно значения в кортеж, проверяя если там число делаем его int и все туда же тулим

Затем zip склеиваем значения, так как они все упорядочены

А сортируем мы по первому значению кортежа (в lambda x попадает сразу ('Номер', 1, 2, 3, 4, 5)... и сортируется это по order)