Материал, который мы изучили во второй половине курса довольно сложный, поэтому и задачи на повторение будут довольно объемны. Давайте подробно разберем условия, что нам нужно сделать, и набросаем план решения. Начнем с того, что у нас есть на входе нашей задачи. Во-первых, у нас будет веб-страница в Интернете, на которой размещена таблица результатов Всероссийской олимпиады школьников по информатике. Таблица будет записана в таком формате: первая колоночка — это место школьника в олимпиаде, вторая колоночка — это данные об участнике (фамилия, имя, отчество, и в скобочках через запятую регион, который он представляет и класс). Следующая колоночка — это количество баллов по олимпиаде у этого школьника. И последняя колоночка — это информация о дипломе школьника (там записано победитель или призер, если школьник победитель или призер, а иначе она пустая). Например, первое место у нас занимает Иванов Иван Иванович, который представляет Ивановскую область и он из 11 класса. Он набирает 780 баллов и является победителем олимпиады. Второе место занимает Кузнецова Мария Петровна, которая представляет регион — город Москва и учится в 10 классе. Она набирает 670 баллов, и она является призером олимпиады. Третье место, например, занимает Макаров Макар Макарович, который представляет Республику Татарстан, и он из девятого класса. Он набирает, например, 590 баллов и у него, например, нет диплома ни победителя, ни призера, поэтому ячейка, которая соответствует информации о дипломе для него будет пустой. Вот такая веб-страница, которую нам с вами нужно будет обработать. Еще один источник входных данных в данной задачи — это текстовой файл, который будет называться "regions.txt ", в котором будут записаны названия регионов, для которых нужно будет собрать данные об олимпиаде. Каждый регион будет записан с новой строки. Например, (записываем каждый раз с новой строки), Московская область, Краснодарский край, город Санкт-Петербург, Республика Адыгея и для всех этих регионов, и только для них нам потребуется собрать данные в нужном формате. В каком формате? Сейчас узнаем. Для этого разберемся, какой результат от нас нужен. В результате мы должны получить файл-таблицу в расширении ".CSV", где для всех регионов, которые мы записали в текстовом файле "regions.txt ", и только для них (ничего лишнего быть не должно) собрана информация по указанной ранее веб-страницы с результатами олимпиады. Вот в таком формате должна быть представлена эта таблица. Здесь должно быть: в первой колоночке — название региона; во второй колоночке — средний балл всех участников олимпиады из этого, которые представляют этот регион; в третьей колоночке — общее количество участников, которые представляют этот регион; и в последней — количество победителей и призеров из указанного региона. Зададим некие ограничения на этот результат. Во-первых, мы хотим рассматривать только учеников из 11 класса. Например, мы собираем статистику для какого-то вуза и нас интересуют только те, кто скоро будет заканчивать школу. Результат мы хотим отсортировать по среднему баллу так, чтобы прикинуть, где школьники лучше всего в среднем пишут олимпиаду. В качестве разделителя в нашей таблице в формате ".CSV" мы будем использовать запятые, то есть разные ячейки на одной строке мы будем записывать через запятую. И наконец, чтобы у нас не получалась слишком большая колоночка для среднего балла, мы будем округлять средний балл до двух знаков после запятой. Например, я выдумала какой-то результат. На первом месте пусть, например, будет город Санкт-Петербург, в нем будет средний балл 560, 23 участника, из них 15 победителей и призеров. И дальше, Московская область, Республика Адыгея и Краснодарский край. Для них тоже указаны средние баллы (два знака после запятой), количество (общее) участников из 11 класса в этой олимпиаде и количество победителей и призеров. Вот такую табличку мы с вами должны получить. Объем задачи действительно довольно большой, много данных, поэтому давайте набросаем план решения, по которому мы с вами будем идти. Прежде всего все наши входные данные, которые есть, нам нужно прочитать. У нас есть текстовый файл и веб-страница. Текстовый файл прочитать проще, поэтому начнем с него. Наш первый шаг — это считывание текстового файла. В текстовом файле записаны названия регионов. Нам их нужно вытащить из этого файла и куда-то сохранить. Сохранять мы будем во множестве, потому что когда мы получим табличку с веб-страницы, мы для каждой строки из этой таблицы будем проверять, входит ли информация из этой строки в наше множество. Мы будем осуществлять много проверок с помощью ключевого слова "in". Мы уже говорили об этом раньше, что в таком случае хорошо использовать множество. Кроме того, нам не важен порядок элементов, нас интересуют только уникальные значения, поэтому множество — это отличный вариант. Далее нам с вами нужно прочитать веб-страницу и научиться проходить по всем строкам таблицы, которая там записана. Мы с вами уже знаем, что загружаем веб-страницу мы с помощью модуля "requests", и мы можем извлечь содержимое оттуда (поглядим на таблицу и строки этой таблицы) с помощью модуля, который называется "Beautiful Soup". Итак, вот мы получили список, точнее, множество регионов, у нас есть таблица, и мы умеем проходить по всем ее строкам. Дальше нам нужно как-то обработать информацию и собрать из этой таблицы. Для хранения информации из таблицы мы будем использовать словарь. Ключи в таком словаре — это будут названия регионов, потому что нам нужно сохранять информацию для каких-то регионов, а значениями такого словаря будут вложенные словари из двух пар. Первая пара — это ключ (строка) "points" и значение — список всех баллов участников из данного региона. Из этого списка мы позже сможем извлечь сразу и средний балл всех участников, и общее количество участников, как длина такого списка. Мы просто сохраняем все баллы участников из данного региона. И вторая пара-ключ значение в нашем вложенном в словаре — это ключ, который называется "winners" (строка "winners"), и этому ключу мы сопоставим просто целое число — количество победителей и призеров олимпиады из данного региона. Далее, мы отсортируем наш словарь. Нам нужно отсортировать словарь не в том порядке, который по умолчанию, то есть по порядку, который задан на ключах, а по среднему баллу участников из каждого региона. Поэтому при сортировке мы будем передавать параметр "key", который должен являться функцией. Мы с вами напишем такую функцию, которая будет принимать на вход сортируемые значения ключи словарей (названия регионов), и возвращать то значение, по которому нам надо сортировать, то есть средний балл учащихся из этого региона. И тогда наши регионы отсортируются так, как будто бы мы их сортируем по среднему баллу. На этом задача будет практически решена. Все что нам останется, это вывести результаты в файл-таблицу. Мы назовем ее "regions-statistics.CSV ". Мы пройдем цикл по отсортированному словарю, точнее, по его отсортированным ключам, и запишем в файл все нужные данные, которые нам нужны для решения задачи. Отлично! Теперь мы готовы приступать к решению.