Помогите решить задачу
Одни жанры встречаются чаще других. Давайте найдём самые популярные. Создайте таблицу и сохраните её в переменной genres_counts. Она должна состоять из двух столбцов: «название жанра» и «количество фильмов с ним».
Все жанры мы собрали в переменной all_genres. Наполните таблицу данными. Отсортируйте столбец «количество» по убыванию. Мы уже написали код для вывода в таком формате:
Скопировать код
Жанр | Количество
————————
. | .
Скрапинг сайта с помощью Python: гайд для новичков
В этой статье мы разберемся, как создать HTML скрапер на Python, который получает неофициальный доступ к коду сайта и позволяет извлечь необходимые данные.
Отличие от вызовов API
Альтернативный метод получения данных сайта — вызовы API. Взаимодействие с API — это официально предоставляемый владельцем сайта способ получения данных прямо из БД или обычных файлов. Обычно для этого требуется разрешение владельца сайта и специальный токен. Однако апи доступен не всегда, поэтому скрапинг так привлекателен, однако его законность вызывает вопросы.
Юридические соображения
Скрапинг может нарушать копирайт или правила использования сайта, особенно когда он используется для получения прибыли, конкурентного преимущества или причинения ущерба (например из-за слишком частых запросов). Однако скрапинг публично доступен и используется для личного использования, академических целей или безвредного некоммерческого использования.
Если данные являются платными, требуют регистрации, имеют явную защиту от скрапинга, содержат конфиденциальные данные или личные данные пользователей, то нужно избегать любого из видов скрапинга.
Установка Beautiful Soup в Python
Beautiful Soup — это Python библиотека для скрапинга данных сайтов через HTML код.
Установите последнюю версию библиотеки.
Чтобы делать запросы, установите requests (библиотеку для отправки HTTP запросов):
Импортируйте библиотеки в файле Python или Jupiter notebook:
И несколько стандартных библиотек, которые потребуются для скрапинга на Python:
Введение
Представьте, что мы хотим произвести скрапинг платформы, содержащей общедоступные объявления о недвижимости. Мы хотим получить цену недвижимости, ее адрес, расстояние, название станции и ближайший до нее тип транспорта для того, чтобы узнать, как цены на недвижимость распределяются в зависимости от доступности общественного транспорта в конкретном городе.
Предположим, что запрос приведет к странице результатов, которая выглядит следующим образом:
Как только мы узнаем, в каких элементах сайта хранятся необходимые данные, нам нужно придумать логику скрапинга, которая позволит нам получить всю нужную информацию из каждого объявления.
Нам предстоит ответить на следующие вопросы:
- Как получить одну точку данных для одного свойства (например данные из тега price в первом объявлении)?
- Как получить все точки данных для одного свойства со всей страницы (например все теги price с одной страницы)?
- Как получить все точки данных для одного свойства всех страниц с результатами (например все теги price со всех страниц с результатами)?
- Как устранить несоответствие, когда данные могут быть разных типов (например, есть некоторые объявления, в которых в поле цены указана цена по запросу. В конечном итоге у нас будет столбец, состоящий из числовых и строковых значений, что в нашем случае не позволяет провести анализ)?
- Как лучше извлечь сложную информацию (Например, предположим, что каждое объявление содержит информацию об общественном транспорте, например “0,5 мили до станции метро XY”)?
Логика получения одной точки данных
Все примеры кода для скрапинга на Python можно найти в Jupiter Notebook файле на GitHub автора.
Запрос кода сайта
Во-первых, мы используем поисковый запрос, который мы сделали в браузере в скрипте Python:
Переменная soup содержит полный HTML-код страницы с результатами поиска.
Поиск тегов-свойств
Для этого нам потребуется браузер. Некоторые популярные браузеры предлагают удобный способ получения информации о конкретном элементе напрямую. В Google Chrome вы можете выбрать любой элемент сайта и, нажав правой кнопкой, выбрать пункт «Исследовать элемент» . Справа откроется код сайта с выделенным элементом.
HTML классы и атрибут id
HTML-классы и id в основном используются для ссылки на класс в таблице стилей CSS, чтобы данные могли отображаться согласованным образом.
В приведенном выше примере, класс, используемый для получения информации о ценах из одного объявления, также применяется для получения цен из других объявлений (что соответствует основной цели класса).
Обратите внимание, что HTML-класс также может ссылаться на ценники за пределами раздела объявлений (например, специальные предложения, которые не связаны с поисковым запросом, но все равно отображаются на странице результатов). Однако для целей этой статьи мы фокусируемся только на ценах в объявлениях о недвижимости.
Вот почему мы сначала ориентируемся на объявление и ищем HTML-класс только в исходном коде для конкретного объявления:
Использование .text в конце метода find() позволяет нам возвращать только обычный текст, как показано в браузере. Без .text он вернет весь исходный код строки HTML, на которую ссылается класс:
Важное примечание: нам всегда нужно указывать элемент, в данном случае это p.
Логика получения всех точек данных с одной страницы
Чтобы получить ценники для всех объявлений, мы применяем метод find.all() вместо find():
Переменная ads теперь содержит HTML-код для каждого объявления на первой странице результатов в виде списка списков. Этот формат хранения очень полезен, так как он позволяет получить доступ к исходному коду для конкретных объявлений по индексу.
Чтобы получить все ценники, мы используем словарь для сбора данных:
Важное примечание: использование идентификатора позволяет находить объявления в словаре:
Получение точек данных со всех страниц
Обычно результаты поиска либо разбиваются на страницы, либо бесконечно прокручиваются вниз.
Вариант 1. Веб-сайт с пагинацией
URL-адреса, полученные в результате поискового запроса, обычно содержат информацию о текущем номере страницы.
Как видно на рисунке выше, окончание URL-адреса относится к номеру страницы результатов.
Важное примечание: номер страницы в URL-адресе обычно становится видимым со второй страницы. Использование базового URL-адреса с дополнительным фрагментом &pn=1 для вызова первой страницы по-прежнему будет работать (в большинстве случаев).
Применение одного цикла for-loop поверх другого позволяет нам перебирать страницы результатов:
Определение последней страницы результатов
Вы можете задаться вопросом, как определить последнюю страницу результатов? В большинстве случаев после достижения последней страницы, любой запрос с большим числом, чем фактическое число последней страницы, приведет нас обратно на первую страницу. Следовательно, использование очень большого числа для ожидания завершения сценария не работает. Через некоторое время он начнет собирать повторяющиеся значения.
Чтобы решить эту проблему, мы будем проверять, есть ли на странице кнопка с такой ссылкой:
Вариант 2. Сайт с бесконечным скроллом
В таком случае HTML скрапер не сработает. Альтернативные методы мы обсудим в конце статьи.
Устранение несогласованности данных
Если нам нужно избавиться от ненужных данных в самом начале скрапинга на Python, мы можем использовать обходной метод:
Функция для определения аномалий
И применить его при сборе данных:
Форматирование данных на лету
Мы могли заметить, что цена хранится в строке вместе с запятыми с символом валюты. Мы можем исправить это ещё на этапе скрапинга:
Используем эту функцию:
Получение вложенных данных
Информация об общественном транспорте имеет вложенную структуру. Нам потребуются данные о расстоянии, названии станции и типе транспорта.
Отбор информации по правилам
Каждый кусочек данных представлен в виде: число миль, название станции. Используем слово «миль» в качестве разделителя.
Первоначально переменная transport хранит два списка в списке, поскольку есть две строки информации об общественном транспорте (например, “0,3 мили Слоун-сквер”, “0,5 мили Южный Кенсингтон”). Мы перебираем эти списки, используя len транспорта в качестве значений индекса, и разделяем каждую строку на две переменные: расстояние и станцию.
Поиск дополнительных HTML атрибутов для визуальной информации
В коде страницы мы можем найти атрибут testid, который указывает на тип общественного транспорта. Он не отображается в браузере, но отвечает за изображение, которое отображается на странице. Для получения этих данных нам нужно использовать класс css-StyledIcon:
Преобразование в датафрейм и экспорт в CSV
Когда скрапинг выполнен, все извлеченные данные доступны в словаре словарей.
Давайте сначала рассмотрим только одно объявление, чтобы лучше продемонстрировать заключительные шаги трансформации.
Преобразуем словарь в список списков, чтобы избавиться от вложенности
Создаём датафрейм
Мы можем экспортировать датафрейм в CSV:
Преобразование всех объявлений в датафрейм:
Мы это сделали! Теперь наш скрапер готов к тестированию.
Ограничения HTML скрапинга и его альтернативы
Этот пример показывает, насколько простым может быть скрапинг HTML на Python в стандартном случае. Для этого не нужно исследовать документацию. Это требует, скорее, творческого мышления, чем опыта веб-разработки.
Не могу передать аргумент функции, в чем моя ошибка?
Задание в Яндекс практикуме:
Отфильтруйте таблицу, оставив в ней фильмы от 2000 года и новее. Затем отсортируйте её по сборам по убыванию и напечатайте на экране топ-5 результатов.
В подсказке:
Сначала вызовите функцию filter_after() для фильтрации таблицы. Её результат передайте как аргумент функции print_top5_by_column().
Не могу передать аргумент функции
- Вопрос задан более двух лет назад
- 1123 просмотра
- Вконтакте
def print_top5_by_column(data, column, reverse) — требует 3 аргумента, вы высылаете 1: print_top5_by_column(filtered_data)
Скопируйте лог ошибки, что бы было понятнее
*Редактирую*
Разобрал код, нашёл ошибку
Код должен выглядеть следующим образом
- Вконтакте
при добавлении
filtered_data = filter_after(oscar_data, 2000)
print_top5_by_column(filtered_data, column, reverse)
dsibi / 01. Анализ по группам
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Разобьём элементы таблиц на группы и проанализируем их свойства. |
Чему вы научитесь |
Создавать функции, фильтровать данные и пользоваться условным оператором. |
Сколько времени это займёт |
4 часа: 17 уроков примерно по 14 минут. |
Постановка задачи |
Каждый год Американская киноакадемия вручает премию «Оскар» за лучший фильм. Проанализируем фильмы, получившие эту премию за последние 30 лет, и посмотрим, как менялись предпочтения киноакадемии за это время. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Мы собрали данные о последних 30 кинофильмах, получивших «Оскар» как самый лучший фильм. |
НАЗВАНИЕ ГОД РЕЙТИНГ ДЛИНА, МИН. ЖАНР БЮДЖЕТ, $ МЛН СБОРЫ, $ МЛН |
Форма воды 2017 6.914 123 фантастика, драма 19.4 195.243464 |
Лунный свет 2016 6.151 110 драма 1.5 65.046687 |
В центре внимания 2015 7.489 129 драма, криминал, история 20.0 88.346473 |
Бёрдмэн 2014 7.604 119 драма, комедия 18.0 103.215094 |
12 лет рабства 2013 7.71 133 драма, биография, история 20.0 178.371993 |
Операция «Арго» 2012 7.517 120 триллер, драма, биография 44.5 232.324128 |
Артист 2011 7.942 96 драма, мелодрама, комедия 15.0 133.432856 |
Король говорит! 2010 7.977 118 драма, биография, история 15.0 414.211549 |
Повелитель бури 2008 7.298 126 триллер, драма, военный, история 15.0 49.230772 |
Миллионер из трущоб 2008 7.724 120 драма, мелодрама 15.0 377.910544 |
Старикам тут не место 2007 7.726 122 триллер, драма, криминал 25.0 171.627166 |
Отступники 2006 8.456 151 триллер, драма, криминал 90.0 289.847354 |
Столкновение 2004 7.896 108 триллер, драма, криминал 6.5 98.410061 |
Малышка на миллион 2004 8.075 132 драма, спорт 30.0 216.763646 |
Властелин колец: Возвращение Короля 2003 8.617 201 фэнтези, драма, приключения 94.0 1119.110941 |
Чикаго 2002 7.669 113 мюзикл, комедия, криминал 45.0 306.776732 |
Игры разума 2001 8.557 135 драма, биография, мелодрама 58.0 313.542341 |
Гладиатор 2000 8.585 155 боевик, драма, приключения 103.0 457.640427 |
Красота по-американски 1999 7.965 122 драма 15.0 356.296601 |
Влюбленный Шекспир 1998 7.452 123 драма, мелодрама, комедия, история 25.0 289.317794 |
Титаник 1997 8.369 194 драма, мелодрама 200.0 2185.372302 |
Английский пациент 1996 7.849 155 драма, мелодрама, военный 27.0 231.976425 |
Храброе сердце 1995 8.283 178 драма, военный, биография, история 72.0 210.409945 |
Форрест Гамп 1994 8.915 142 драма, мелодрама 55.0 677.386686 |
Список Шиндлера 1993 8.819 195 драма, биография, история 22.0 321.265768 |
Непрощенный 1992 7.858 131 драма, вестерн 14.4 159.157447 |
Молчание ягнят 1990 8.335 114 триллер, криминал, детектив, драма, ужасы 19.0 272.742922 |
Танцующий с волками 1990 8.112 181 драма, приключения, вестерн 22.0 424.208848 |
Шофёр мисс Дэйзи 1989 7.645 99 драма 7.5 145.793296 |
Человек дождя 1988 8.25 133 драма 25.0 354.825435 |
Было бы интересно определить лидеров по разным параметрам: например, по рейтингу и бюджету. Для этого воспользуемся сортировкой. |
# Python получает статистику как список списков, который |
# хранится в переменной oscar_data (от англ. Oscar data, |
# "данные Оскара"). |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
print('# Самый высокий рейтинг') |
print() |
# Чтобы отсортировать по рейтингу, указываем значением |
# лямбда-функции (ключа сортировки) третий (с индексом 2) |
# элемент каждого списка. Это и есть показатель рейтинга. |
# Порядок сортировки указываем по убыванию. |
oscar_data.sort(key=lambda row: row[2], reverse=True) |
# для краткости столбец с жанром не печатаем |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in oscar_data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
print() |
print() |
print('# Самый большой бюджет') |
print() |
oscar_data.sort(key=lambda row: row[5], reverse=True) |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in oscar_data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
print() |
# Самый высокий рейтинг |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Форрест Гамп | 1994 | 8.91 | 142 | 55.0 | 677.4 | |
Список Шиндлера | 1993 | 8.82 | 195 | 22.0 | 321.3 | |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Гладиатор | 2000 | 8.59 | 155 | 103.0 | 457.6 | |
Игры разума | 2001 | 8.56 | 135 | 58.0 | 313.5 | |
# Самый большой бюджет |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Титаник | 1997 | 8.37 | 194 | 200.0 | 2185.4 | |
Гладиатор | 2000 | 8.59 | 155 | 103.0 | 457.6 | |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Отступники | 2006 | 8.46 | 151 | 90.0 | 289.8 | |
Храброе сердце | 1995 | 8.28 | 178 | 72.0 | 210.4 | |
Ещё раз взглянем на код вывода таблицы на экран: |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in oscar_data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
print() |
Чтобы вывести таблицу на экран второй раз, нам пришлось скопировать код. Так лучше не делать, потому что: |
Любое изменение в скопированном коде придётся делать в каждом повторении. Это повышает риск ошибки. |
Тому, кто будет читать код, придётся разбираться заново в каждом повторении. |
Если фрагмент кода понадобится не однажды, ему дают имя. Получается функция. Логику её работы прописывают один раз, а затем вызывают всюду, где она нужна. |
Напишем функцию для перевода длительности фильма из минут в часы. Помните, что у функции print() есть аргумент — строка, которую она печатает? У нашей функции тоже будет аргумент — длительность фильма в минутах. Функция проведёт с ним расчёты и напечатает результат на экране: |
def print_length_hours(minutes): |
hours = minutes / 60 |
print('Длительность: <:.2f>часов.'.format(hours)) |
# для наглядности функции отделяют от остального кода двумя переносами |
print('Форма воды') |
print_length_hours(123) |
print() |
print('Шофёр мисс Дэйзи') |
print_length_hours(99) |
print() |
Форма воды |
Длительность: 2.05 часов. |
Шофёр мисс Дэйзи |
Длительность: 1.65 часов. |
Мы описали логику работы функции, а потом дважды её вызвали. Ключевое слово def указывает на начало определения функции. Здесь мы снова столкнулись с отступами в 4 пробела: они выделяют тело функции — код, который эта функция будет выполнять. |
image |
Аргумент minutes — это по сути переменная внутри функции. Её значение заранее не известно — оно задаётся в скобках при вызове функции. В зависимости от этого значения на экране печатается подходящий текст. |
TASK |
В таблице бюджеты указаны в долларах. Напишите функцию print_budget_in_rubles(), которая переводит их в рубли и печатает на экране. Используйте курс 1$ = 67.01₽. |
Функция должна принимать сумму в долларах как аргумент и выводить на экран результат в формате: |
Бюджет: 13402.00 млн ₽ |
Обратите внимание: сумма выводится с двумя знаками после запятой. |
SOLUTION |
# Записываем курс в переменной rubles_for_dollar |
# (англ. rubles for dollar, "рублей за доллар"). |
rubles_for_dollar = 67.01 |
def print_budget_in_rubles(dollars): |
rubles = dollars*rubles_for_dollar |
print('Бюджет: <:.2f>млн ₽'.format(rubles)) |
print('Титаник') |
print_budget_in_rubles(200.0) |
print() |
print('Гладиатор') |
print_budget_in_rubles(103.0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Одного аргумента функции часто не хватает для сложных задач. В этом уроке мы приведём пример такой задачи и покажем, как делать функции с несколькими аргументами. |
Начнём с того, что напишем функцию для печати на экране первых 5 элементов таблицы. |
def print_top5(data): |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
Обратите внимание на отступы для цикла в коде функции. Мы вложили цикл в её тело, и поэтому тело такого цикла набирается с отступом уже не в 4 пробела, а в 8. |
Теперь вызовем нашу функцию: она печатает на экране топовые (по рейтингу и бюджету) фильмы. |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
print('# Самый высокий рейтинг') |
print() |
oscar_data.sort(key=lambda row: row[2], reverse=True) |
print_top5(oscar_data) |
print() |
print() |
print('# Самый большой бюджет') |
print() |
oscar_data.sort(key=lambda row: row[5], reverse=True) |
print_top5(oscar_data) |
print() |
print() |
# Самый высокий рейтинг |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Форрест Гамп | 1994 | 8.91 | 142 | 55.0 | 677.4 | |
Список Шиндлера | 1993 | 8.82 | 195 | 22.0 | 321.3 | |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Гладиатор | 2000 | 8.59 | 155 | 103.0 | 457.6 | |
Игры разума | 2001 | 8.56 | 135 | 58.0 | 313.5 | |
# Самый большой бюджет |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Титаник | 1997 | 8.37 | 194 | 200.0 | 2185.4 | |
Гладиатор | 2000 | 8.59 | 155 | 103.0 | 457.6 | |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Отступники | 2006 | 8.46 | 151 | 90.0 | 289.8 | |
Храброе сердце | 1995 | 8.28 | 178 | 72.0 | 210.4 | |
Улучшим нашу функцию: пусть она сама сортирует таблицу. Чтобы это сделать, пропишем в коде ещё один аргумент (количество теоретически не ограничено). Этим вторым аргументом станет индекс столбца, по которому мы хотим сортировать. Указывают его в скобках после первого аргумента. Пусть в объявлении функции этот параметр будет называться column: |
def print_top5_by_column(data, column): |
. |
Тогда для сортировки по столбцу с индексом 3 функцию нужно вызвать так: |
print_top5_by_column(oscar_data, 3) |
Обратите внимание: мы переименовали функцию в соответствии с её целью. Имена аргументов тоже понятно описывают, для чего те нужны. |
Напишем тело функции и обновим код печати таблицы: |
def print_top5_by_column(data, column): |
data.sort(key=lambda row: row[column], reverse=True) |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
Используем её, чтобы вывести информацию и по другим столбцам: |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
print('# Самый высокий рейтинг') |
print() |
print_top5_by_column(oscar_data, 2) |
print() |
print() |
print('# Самый большой бюджет') |
print() |
print_top5_by_column(oscar_data, 5) |
print() |
print() |
print('# Самые большие сборы') |
print() |
print_top5_by_column(oscar_data, 6) |
print() |
print() |
print('# Самая большая длина') |
print() |
print_top5_by_column(oscar_data, 3) |
print() |
print() |
# Самый высокий рейтинг |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Форрест Гамп | 1994 | 8.91 | 142 | 55.0 | 677.4 | |
Список Шиндлера | 1993 | 8.82 | 195 | 22.0 | 321.3 | |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Гладиатор | 2000 | 8.59 | 155 | 103.0 | 457.6 | |
Игры разума | 2001 | 8.56 | 135 | 58.0 | 313.5 | |
# Самый большой бюджет |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Титаник | 1997 | 8.37 | 194 | 200.0 | 2185.4 | |
Гладиатор | 2000 | 8.59 | 155 | 103.0 | 457.6 | |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Отступники | 2006 | 8.46 | 151 | 90.0 | 289.8 | |
Храброе сердце | 1995 | 8.28 | 178 | 72.0 | 210.4 | |
# Самые большие сборы |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Титаник | 1997 | 8.37 | 194 | 200.0 | 2185.4 | |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Форрест Гамп | 1994 | 8.91 | 142 | 55.0 | 677.4 | |
Гладиатор | 2000 | 8.59 | 155 | 103.0 | 457.6 | |
Танцующий с волками | 1990 | 8.11 | 181 | 22.0 | 424.2 | |
# Самая большая длина |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Властелин колец: Возвращение Короля | 2003 | 8.62 | 201 | 94.0 | 1119.1 | |
Список Шиндлера | 1993 | 8.82 | 195 | 22.0 | 321.3 | |
Титаник | 1997 | 8.37 | 194 | 200.0 | 2185.4 | |
Танцующий с волками | 1990 | 8.11 | 181 | 22.0 | 424.2 | |
Храброе сердце | 1995 | 8.28 | 178 | 72.0 | 210.4 | |
TASK_1_3 |
Мы продолжили улучшать функцию print_top5_by_column() и добавили в неё возможность изменять порядок сортировки. Для этого мы дописали ещё один аргумент reverse. Он имеет такой же смысл, как аргумент reverse метода sort(): принимает значение False, если нужно сортировать в обычном порядке, и True — если в обратном. |
После добавления нового аргумента написанные ранее вызовы функций перестали работать. Проблема в том, что функция теперь принимает три аргумента, а мы передаём только два. Исправьте эти вызовы, передав им третий аргумент (он будет равен True, так как мы по-прежнему хотим видеть бо́льшие значения наверху). Затем выведите на экран 5 самых коротких фильмов из таблицы (третьим аргументом будет False, чтобы наверху были короткие фильмы, а не длинные). |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def print_top5_by_column(data, column, reverse): |
data.sort(key=lambda row: row[column], reverse=reverse) |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
# обновите код вывода топовых значений |
print('# Самый высокий рейтинг') |
print() |
print_top5_by_column(oscar_data, 2, True) |
print() |
print() |
print('# Самый большой бюджет') |
print() |
print_top5_by_column(oscar_data, 5, True) |
print() |
print() |
print('# Самые большие сборы') |
print() |
print_top5_by_column(oscar_data, 6,True) |
print() |
print() |
print('# Самая большая длина') |
print() |
print_top5_by_column(oscar_data, 3,True) |
print() |
print() |
# добавьте вывод самых коротких фильмов |
print('# Самая маленькая длина') |
print() |
print_top5_by_column(oscar_data, 3,False) |
print() |
print() |
TASK_2_3 |
Напишите функцию print_profit(), которая вычисляет и выводит на экран прибыль, полученную от фильма. Прибыль вычисляется как разность сборов (выручки) и бюджета. Функция должна принимать значения бюджета и сборов как аргументы (первый аргумент — бюджет, второй аргумент — сборы). Названия для аргументов выберите самостоятельно. Результат должен печататься на экране с двумя знаками после запятой и без сопроводительного текста. |
В прекоде мы привели пример использования этой функции. |
SOLUTION |
def print_profit(budjet,revenue): |
profit=revenue-budjet |
print("<:.2f>".format(profit)) |
print("Прибыль от фильма «Титаник»:") |
print_profit(200.0, 2185.372302) |
TASK_3_3 |
Напишите функцию print_mean(), которая считает и выводит на экран среднее значение по заданному столбцу. Функция должна принимать два аргумента —data (таблицу) и column (номер столбца). Результат должен печататься на экране с двумя знаками после запятой и без сопроводительного текста. |
После создания функции можно посчитать средние значения по большинству столбцов. Мы уже сделали это в прекоде. |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def print_mean(data, column): |
total = 0 |
for row in data: |
# чтобы получить нужное значение, напишите row[column] |
total += row[column] |
mean = total / len(data) |
print('<:.2f>'.format(mean)) |
print('Средний рейтинг: ', end='') |
print_mean(oscar_data, 2) |
print('Средняя длина: ', end='') |
print_mean(oscar_data, 3) |
print('Средний бюджет: ', end='') |
print_mean(oscar_data, 5) |
print('Средние сборы: ', end='') |
print_mean(oscar_data, 6) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Сейчас наши функции печатают результаты своей работы на экране. После этого мы никак не можем использовать значения, которые они считали. Как правило, это неудобно: например, не получится сохранить среднее в переменную для других расчётов. |
Поэтому функции умеют возвращать значение — передавать результат, который можно сохранить в переменной. Давайте, например, переделаем функцию пересчёта долларов в рубли и обновим код для печати бюджета в рублях: |
rubles_for_dollar = 67.01 |
def dollars_to_rubles(dollars): |
rubles = dollars * rubles_for_dollar |
return rubles |
titanic_dollars = 200.0 |
titanic_rubles = dollars_to_rubles(titanic_dollars) |
print('Бюджет фильма "Титаник": <:.2f>млн ₽'.format(titanic_rubles)) |
Бюджет фильма "Титаник": 13402.00 млн ₽ |
Ключевое слово return указывает, какое значение вернёт функция. Например, dollars_to_rubles() возвращает сохранённое в переменной rubles произведение. |
Функция работает по тому же принципу, что и такси — всегда выполняет один и тот же набор действий: |
приезжает (адрес отправления — первый аргумент); |
отвозит (пункт назначения — второй аргумент); |
выставляет счёт (стоимость — возвращаемое значение). |
Если функция это такси, то вызов функции — вызов такси: |
адреса отправления и прибытия — это значения аргументов: они определяются в момент вызова; |
стоимость поездки — это возвращаемое значение. |
TASK 1_3 |
Посчитаем суммарные бюджет и сборы фильмов из таблицы. Напишите функцию column_sum(), которая получает на вход таблицу и номер столбца, и возвращает сумму значений по этому столбцу. Используйте эту функцию, чтобы напечатать результат в таком формате: |
Суммарный бюджет: . млн $ |
Суммарные сборы: . млн $ |
Суммы выводите с точностью до двух знаков после запятой. |
Напоминаем, что бюджет хранится в столбце с индексом 5, а сборы — с индексом 6. |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def column_sum(data, column): |
result=0 |
for row in data: |
result+=row[column] |
return result |
total_budget = column_sum(oscar_data, 5) |
print('Суммарный бюджет: <:.2f>млн $'.format(total_budget)) |
total_gross = column_sum(oscar_data, 6) |
print('Суммарные сборы: <:.2f>млн $'.format(total_gross)) |
TASK 2_3 |
Представим, что каждый человек посмотрел все оскаровские фильмы. Сколько тогда пришлось бы отдать за каждый билет в кино, чтобы обеспечить кинокартинам сборы не меньше нынешних? |
Чтобы найти эту величину, нужно суммарные сборы всех фильмов в таблице (столбец с индексом 6) поделить на численность земного населения. По данным Бюро переписи населения США за 2018 год на Земле проживают 7539 миллионов человек. Суммарные сборы вам поможет найти функция из предыдущего задания. Поделите одно на другое и результат выведите на экран вот в таком виде: |
Каждый человек в среднем потратил $. на фильмы, получившие "Оскар". |
Как и прежде, нужная точность — два знака после запятой. |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def column_sum(data, column): |
result = 0 |
for row in data: |
result += row[column] |
return result |
# (англ. total people, "всего людей"). Остальным двум переменным — для |
# суммы затрат и для потраченного на душу населения — можете дать любые |
# имена по своему вкусу. |
total_people = 7539 |
total_gross = column_sum(oscar_data, 6) |
spent_per_person = total_gross / total_people |
print('Каждый человек в среднем потратил ', end='') |
print('$ <:.2f>на фильмы, получившие "Оскар".'.format(spent_per_person)) |
TASK 3_3 |
Функция print_mean(), которую вы писали в прошлом уроке, находит среднее значение и выводит его на экран. Измените код этой функции так, чтобы вместо печати на экране она возвращала найденное среднее. |
Для подсчёта суммы не пишите цикл — вызывайте функцию column_sum(). Переиспользование кода — хорошая практика. |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def column_sum(data, column): |
result = 0 |
for row in data: |
result += row[column] |
return result |
def column_mean(data, column): |
total=column_sum(data, column) |
mean=total/len(data) |
return mean |
mean_score = column_mean(oscar_data, 2) |
print('Средний рейтинг: <:.2f>'.format(mean_score)) |
mean_length = column_mean(oscar_data, 3) |
print('Средняя длина: <:.2f>мин.'.format(mean_length)) |
mean_budget = column_mean(oscar_data, 5) |
print('Средний бюджет: <:.2f>млн $'.format(mean_budget)) |
mean_gross = column_mean(oscar_data, 6) |
print('Средние сборы: <:.2f>млн $'.format(mean_gross)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Мы будем часто создавать функции. Давайте немного разберёмся в их устройстве, чтобы избежать неприятных сюрпризов. Вроде таких: |
# предположим, что бюджет фильма состоит из двух частей: в долларах и в рублях |
rubles = 1200 |
dollars = 65 |
# какова будет сумма в рублях? |
# определим функцию для перевода долларов в рубли |
rubles_for_dollar = 67.01 |
def dollars_to_rubles(dollars): |
# мы опечатались в названии переменной rubles |
rubls = dollars * rubles_for_dollar |
# это строка всё равно работает, но использует не ту переменную |
return rubles |
total = rubles + dollars_to_rubles(dollars) |
print("Суммарный бюджет: <:.2f>млн ₽".format(total)) |
# бюджет на самом деле: 5555.65 млн ₽ |
Суммарный бюджет: 2400.00 млн ₽ |
Всё дело в объявлении переменных. Функция, встречая переменную, пытается найти её значение в своём же коде. Если находит — пользуется, если нет — начинает смотреть «снаружи», в коде программы. Получается, если и внутри, и снаружи от функции есть переменные с одинаковыми именами, будет использована та, что внутри. |
Мы объявили переменную rubles вне функции, а затем хотели объявить переменную с таким же именем внутри. Из-за опечатки функция не нашла значение внутри себя и пошла смотреть снаружи. Нашла и вернула нам. Функция отработала хорошо, но получилось совсем не то, чего мы хотели. |
Избежать таких проблем поможет знание о глобальных и локальных переменных. Глобальные переменные — это те, что объявлены вне функций. К ним можно обращаться откуда угодно. Отсюда и название. |
Соответственно, переменные, объявленные внутри функции, — локальные. К ним обратиться из кода вне тела функции нельзя. |
Не давайте локальным и глобальным переменным одинаковые имена — опечатки потом очень трудно искать в коде. |
def column_sum(data, column): |
result = 0 |
for row in data: |
result += row[column] |
return result |
# Переменная result — локальная. Обращение к ней |
# снаружи от функции приводит к ошибке: |
print(result) |
Traceback (most recent call last): |
File "main.py", line 7, in <module> |
print(result) |
NameError: name 'result' is not defined |
Локальные переменные можно сравнить с людьми, находящимися с вами в одной комнате, а глобальные — со знакомыми, чей номер телефона у вас есть. Вы можете обратиться к любому человеку, пока он в той же комнате, что и вы. А своему знакомому вы можете позвонить, где бы он ни был. |
Вернёмся к нашей сломанной функции dollars_to_rubles() и починим её. Сначала поменяем имя глобальной переменной на более говорящее, назовём её budget_rubles: |
budget_rubles = 1200 |
budget_dollars = 65 |
rubles_for_dollar = 67.01 |
def dollars_to_rubles(dollars): |
rubls = dollars * rubles_for_dollar |
return rubles |
total = budget_rubles + dollars_to_rubles(budget_dollars) |
print("Суммарный бюджет: <:.2f>млн ₽".format(total)) |
Traceback (most recent call last): |
File "main.py", line 10, in <module> |
total = budget_rubles + dollars_to_rubles(budget_dollars) |
File "main.py", line 8, in dollars_to_rubles |
return rubles |
NameError: name 'rubles' is not defined |
Теперь Python отловил наш недосмотр и сообщает о нём. Это полезно, потому что облегчает нам поиск ошибок. Последуем совету Python и поправим локальную переменную: |
budget_rubles = 1200 |
budget_dollars = 65 |
rubles_for_dollar = 67.01 |
def dollars_to_rubles(dollars): |
rubles = dollars * rubles_for_dollar |
return rubles |
total = budget_rubles + dollars_to_rubles(budget_dollars) |
print("Суммарный бюджет: <:.2f>млн ₽".format(total)) |
Суммарный бюджет: 5555.65 млн ₽ |
Функция dollars_to_rubles() использует глобальную переменную rubles_for_dollar. Так делать не стоит — лучше, чтобы функция работала только со своими, локальными, переменными. Иначе: |
Сложно будет перенести функцию в другую программу: чтобы всё работало, придётся заодно искать и переносить глобальные переменные; |
Сложно будет читать код — придётся то и дело переключаться с функции на поиск глобальной переменной в коде и обратно. |
Исключение — глобальные переменные, чьё значение в коде не меняется. Такие переменные называют константами. Внимание: для Python это обычные глобальные переменные. Просто разработчики договорились, что если переменная не меняет своего значения нигде в коде, ей дают название из прописных букв. Так при чтении кода легко отличать переменные от констант. А ещё так вы гарантированно не назовёте одинаково локальную переменную и константу. |
RUBLES_FOR_DOLLAR = 67.01 |
budget_rubles = 1200 |
budget_dollars = 65 |
def dollars_to_rubles(dollars): |
rubles = dollars * RUBLES_FOR_DOLLAR |
return rubles |
total = budget_rubles + dollars_to_rubles(budget_dollars) |
print("Суммарный бюджет: <:.2f>млн ₽".format(total)) |
Суммарный бюджет: 5555.65 млн ₽ |
Рекомендуем объявлять константы в самом начале кода программы — так их будет проще искать. Опытные разработчики хранят в константах все числовые значения, даже очевидные, вроде количества минут в часах. Это делает код понятнее. |
TASK |
Создайте функцию minutes_to_hours(): она должна переводить длительность фильма из минут в часы. Пусть на вход функция принимает длительность в минутах, а возвращает — в часах. Количество минут в часах запишите в константу MINUTES_IN_HOUR. |
SOLUTION |
# создайте константу MINUTES_IN_HOUR |
MINUTES_IN_HOUR = 60 |
def minutes_to_hours(minutes): |
length_in_mins = minutes/MINUTES_IN_HOUR |
return length_in_mins |
print('Длина фильма "Форма воды": <:.2f>ч.'.format(minutes_to_hours(123))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Даже если вы не планируете переиспользовать кусок кода, его лучше заключить в функцию. Так вся программа оказывается разбита на именованные блоки, и в ней легко ориентироваться. |
Вооружившись этим знанием, вернёмся к нашим фильмам. |
Одна из важнейших коммерческих характеристик кинокартины — её окупаемость, или ROI. Окупаемость показывает, какую прибыль принёс каждый инвестированный доллар. Вычисляется ROI по формуле: |
ROI = (СБОРЫ – БЮДЖЕТ) / БЮДЖЕТ |
Напишем функцию, чтобы посчитать ROI для каждого оскаровского фильма: |
# англ. add ROI, "добавить ROI" |
def add_roi(data): |
for i in range(len(data)): |
budget = data[i][5] |
gross = data[i][6] |
roi = (gross — budget) / budget |
data[i].append(roi) |
Теперь применим нашу функцию и поймём, какие фильмы оказались самыми доходными: |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
add_roi(oscar_data) |
# индекс нового столбца равен 7 |
oscar_data.sort(key=lambda row: row[7], reverse=True) |
print('Название | ROI ') |
print('——————————————') |
for row in oscar_data[:5]: |
print(' <: <35>| <: >4.1f>'.format(row[0], row[7])) |
Название | ROI |
—————————————— |
Лунный свет | 42.4 |
Король говорит! | 26.6 |
Миллионер из трущоб | 24.2 |
Красота по-американски | 22.8 |
Шофёр мисс Дэйзи | 18.4 |
Как видите, лидеры по доходности совсем не те, что по сборам. |
TASK |
Посчитаем стоимость 1 минуты каждого фильма. Напишите для этого функцию add_price_per_minute(): посчитанное значение она должна добавлять в новый столбец. |
На вход функция пусть принимает 1 аргумент — таблицу с данными. Эту таблицу функции предстоит изменить. Код для вывода на экран мы уже написали. Вот формула для подсчёта: |
СТОИМОСТЬ_МИНУТЫ = БЮДЖЕТ / ДЛИТЕЛЬНОСТЬ |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def add_price_per_minute(data): |
for i in range(len(data)): |
length=data[i][3] |
budget=data[i][5] |
price_per_minute=budget/length |
data[i].append(price_per_minute) |
add_price_per_minute(oscar_data) |
# индекс нового столбца равен 7 |
oscar_data.sort(key=lambda row: row[7], reverse=True) |
print('Название | Цена за минуту, млн $ |') |
print('————————————————————-') |
for row in oscar_data[:5]: |
print(' <: <35>| <: >21.2f>|'.format(row[0], row[7])) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Мы хотели увидеть, как меняются вкусы Киноакадемии. Для такого анализа нужно научить Python различать новые и старые фильмы. |
Тут на помощь приходит условный оператор. Он позволяет создавать «развилки»: то есть задавать условие и выполнять один код, если оно выполняется, и другой — в противном случае. |
Напишем функцию для проверки, получил ли фильм «Оскар» в течение последних 10 лет: |
# функция |
def check_if_recent(year): |
if year < 2008: |
print('Фильм был снят давно') |
else: |
print('Фильм свежий') |
# примеры использования |
print('Бёрдмэн') |
check_if_recent(2014) |
print('Титаник') |
check_if_recent(1997) |
Бёрдмэн |
Фильм свежий. |
Титаник |
Фильм был снят давно. |
Ключевые слова if (англ. if, «если») и else (англ. else, «иначе») задают условный оператор. Если условие выполнено, Python исполнит один код, а если нет — другой. На схеме изображён синтаксис условного оператора: |
image |
Для Python условный оператор — это развилка, на которой нужно принять решение, какой код исполнять. При каждом вызове функции check_if_recent() Python будет попадать на эту развилку и принимать решение. |
image |
Знак < в нашем условии соответствует математическому знаку <. В таблице приведено соответствие других математических знаков: |
МАТЕМАТИЧЕСКИЙ ЗНАК ЗНАК В PYTHON ОПИСАНИЕ |
⩽ <= меньше или равно |
⩾ >= больше или равно |
< < строго меньше |
> > строго больше |
= == в точности равно |
≠ != не равно в точности |
Чтобы запомнить, как правильно пишется: <= или =<, обратите внимание, что порядок такой же, как в описании: «меньше или равно», а не «равно или меньше». |
TASK |
Напишите функцию check_if_long(), которая будет определять, длинный фильм или нет. Фильмы, идущие меньше двух часов будем называть короткими, а остальные — длинными. |
Функция должна принимать на вход длину фильма и печатать на экране: |
Фильм длинный. |
или |
Фильм короткий. |
SOLUTION |
def check_if_long(length): |
if length > 120: |
print('Фильм длинный.') |
else: |
print('Фильм короткий.') |
print('Артист') |
check_if_long(96) |
print('Гладиатор') |
check_if_long(155) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Условный оператор открывает огромное поле возможностей. Например, он поможет нам фильтровать таблицы: то есть выкидывать и оставлять элементы по какому-то правилу. |
Напишем функцию, чтобы отфильтровать таблицу по году. Она будет принимать как аргумент год вручения премии, и возвращать новую таблицу с фильмами, получившими награду в этом году и позже. Например, если указан 2010 год, то должны остаться только фильмы с 2010 по 2017 год. |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
# англ. filter after, "отобрать всё после" |
def filter_after(data, year_threshold): |
# создаём таблицу как список списков – пока пустой |
result = [] |
for row in data: |
year = row[1] |
# Для оператора if можно не указывать блок else, если |
# в нём ничего нет. |
if year >= year_threshold: |
# добавляем в таблицу строку, подходящую под условие |
result.append(row) |
return result |
def print_table(data): |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in data: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
# мы не меняем исходную таблицу, а сохраняем в переменную новую |
filtered_data = filter_after(oscar_data, 2010) |
print_table(filtered_data) |
Название | Год | Рейтинг | Длина | Бюджет | Сборы | |
——————————————————————————— |
Форма воды | 2017 | 6.91 | 123 | 19.4 | 195.2 | |
Лунный свет | 2016 | 6.15 | 110 | 1.5 | 65.0 | |
В центре внимания | 2015 | 7.49 | 129 | 20.0 | 88.3 | |
Бёрдмэн | 2014 | 7.60 | 119 | 18.0 | 103.2 | |
12 лет рабства | 2013 | 7.71 | 133 | 20.0 | 178.4 | |
Операция "Арго" | 2012 | 7.52 | 120 | 44.5 | 232.3 | |
Артист | 2011 | 7.94 | 96 | 15.0 | 133.4 | |
Король говорит! | 2010 | 7.98 | 118 | 15.0 | 414.2 | |
TASK_1_2 |
Отфильтруйте таблицу, оставив в ней фильмы от 2000 года и новее. Затем отсортируйте её по сборам по убыванию и напечатайте на экране топ-5 результатов. |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def filter_after(data, year_threshold): |
result = [] |
for row in data: |
year = row[1] |
if year >= year_threshold: |
result.append(row) |
return result |
def print_top5_by_column(data, column, reverse): |
data.sort(key=lambda row: row[column], reverse=reverse) |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
filtered_data = filter_after(oscar_data, 2000) |
print_top5_by_column(filtered_data, 6, True) |
TASK_2_2 |
Напишите функцию фильтрации фильмов по длине. Она должна отсеивать все фильмы, длиннее времени, полученного на вход. |
Функция должна получать на вход два аргумента: таблицу и время для фильтрации. Она должна возвращать новую таблицу и не менять старую. |
Оставьте в таблице фильмы не длиннее двух часов, и отсортируйте её по сборам. Напечатайте топ-5 элементов полученной таблицы на экране. |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def filter_not_longer_than(data, length_threshold): |
result=[] |
for row in data: |
length=row[3] |
if length <=length_threshold: |
result.append(row) |
return result |
def print_top5_by_column(data, column, reverse): |
data.sort(key=lambda row: row[column], reverse=reverse) |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in data[:5]: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
filtered_data = filter_not_longer_than(oscar_data, 120) |
print_top5_by_column(filtered_data,6,True) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Поле «Жанр» в нашей таблице имеет тип list. Давайте разберёмся, как фильтровать таблицу по нему. |
Дело в том, что поле с типом list содержит несколько значений, а значит, математические проверки не пройдут. Для такого случая в Python есть специальный оператор: in: |
print('драма' in ['фантастика', 'драма']) |
print('комедия' in ['драма', 'криминал', 'история']) |
True |
False |
Такую конструкцию нужно читать: “элемент «драма» есть в списке: «фантастика», «драма»”. |
Это утверждение может быть истинным или ложным, то есть — принимать значение True или False. Таким образом, оператор in удобен в условных конструкциях: |
birdman_genres = ['драма', 'комедия'] |
if 'криминал' in birdman_genres: |
print('Фильм "Бёрдмэн" содержит жанр "криминал"') |
else: |
print('Фильм "Бёрдмэн" не содержит жанр "криминал"') |
Фильм "Бёрдмэн" не содержит жанр "криминал" |
TASK 1_2 |
Отфильтруем же таблицу по жанру! Для этой цели напишите функцию filter_by_genre(). Она должна иметь два аргумента: таблицу с данными и название жанра. А возвращать — новую таблицу с фильмами переданного жанра. |
Как опишете логику, вызывайте новоиспечённую функцию, чтобы найти все мелодрамы. |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
def filter_by_genre(data, genre): |
result=[] |
for row in data: |
genres=row[4] |
if genre in genres: |
result.append(row) |
return result |
def print_table(data): |
print('Название | Год | Рейтинг | Длина | Бюджет | Сборы |') |
print('———————————————————————————') |
for row in data: |
print(' <: <35>| <> | <: >7.2f>| <: >5>| <: >6.1f>| <: >6.1f>|'.format( |
row[0], row[1], row[2], row[3], row[5], row[6])) |
filtered_data = filter_by_genre(oscar_data,'мелодрама') |
print_table(filtered_data) |
TASK 2_2 |
Одни жанры встречаются чаще других. Давайте найдём самые популярные. Создайте таблицу и сохраните её в переменной genres_counts. Она должна состоять из двух столбцов: «название жанра» и «количество фильмов с ним». |
Все жанры мы собрали в переменной all_genres. Наполните таблицу данными. Отсортируйте столбец «количество» по убыванию. Мы уже написали код для вывода в таком формате: |
Жанр | Количество |
———————— |
. | . |
SOLUTION |
oscar_data = [ |
['Форма воды', 2017, 6.914, 123, ['фантастика', 'драма'], 19.4, 195.243464], |
['Лунный свет', 2016, 6.151, 110, ['драма'], 1.5, 65.046687], |
['В центре внимания', 2015, 7.489, 129, ['драма', 'криминал', 'история'], 20.0, 88.346473], |
['Бёрдмэн', 2014, 7.604, 119, ['драма', 'комедия'], 18.0, 103.215094], |
['12 лет рабства', 2013, 7.71, 133, ['драма', 'биография', 'история'], 20.0, 178.371993], |
['Операция "Арго"', 2012, 7.517, 120, ['триллер', 'драма', 'биография'], 44.5, 232.324128], |
['Артист', 2011, 7.942, 96, ['драма', 'мелодрама', 'комедия'], 15.0, 133.432856], |
['Король говорит!', 2010, 7.977, 118, ['драма', 'биография', 'история'], 15.0, 414.211549], |
['Повелитель бури', 2008, 7.298, 126, ['триллер', 'драма', 'военный', 'история'], 15.0, 49.230772], |
['Миллионер из трущоб', 2008, 7.724, 120, ['драма', 'мелодрама'], 15.0, 377.910544], |
['Старикам тут не место', 2007, 7.726, 122, ['триллер', 'драма', 'криминал'], 25.0, 171.627166], |
['Отступники', 2006, 8.456, 151, ['триллер', 'драма', 'криминал'], 90.0, 289.847354], |
['Столкновение', 2004, 7.896, 108, ['триллер', 'драма', 'криминал'], 6.5, 98.410061], |
['Малышка на миллион', 2004, 8.075, 132, ['драма', 'спорт'], 30.0, 216.763646], |
['Властелин колец: Возвращение Короля', 2003, 8.617, 201, ['фэнтези', 'драма', 'приключения'], 94.0, 1119.110941], |
['Чикаго', 2002, 7.669, 113, ['мюзикл', 'комедия', 'криминал'], 45.0, 306.776732], |
['Игры разума', 2001, 8.557, 135, ['драма', 'биография', 'мелодрама'], 58.0, 313.542341], |
['Гладиатор', 2000, 8.585, 155, ['боевик', 'драма', 'приключения'], 103.0, 457.640427], |
['Красота по-американски', 1999, 7.965, 122, ['драма'], 15.0, 356.296601], |
['Влюбленный Шекспир', 1998, 7.452, 123, ['драма', 'мелодрама', 'комедия', 'история'], 25.0, 289.317794], |
['Титаник', 1997, 8.369, 194, ['драма', 'мелодрама'], 200.0, 2185.372302], |
['Английский пациент', 1996, 7.849, 155, ['драма', 'мелодрама', 'военный'], 27.0, 231.976425], |
['Храброе сердце', 1995, 8.283, 178, ['драма', 'военный', 'биография', 'история'], 72.0, 210.409945], |
['Форрест Гамп', 1994, 8.915, 142, ['драма', 'мелодрама'], 55.0, 677.386686], |
['Список Шиндлера', 1993, 8.819, 195, ['драма', 'биография', 'история'], 22.0, 321.265768], |
['Непрощенный', 1992, 7.858, 131, ['драма', 'вестерн'], 14.4, 159.157447], |
['Молчание ягнят', 1990, 8.335, 114, ['триллер', 'криминал', 'детектив', 'драма', 'ужасы'], 19.0, 272.742922], |
['Танцующий с волками', 1990, 8.112, 181, ['драма', 'приключения', 'вестерн'], 22.0, 424.208848], |
['Шофёр мисс Дэйзи', 1989, 7.645, 99, ['драма'], 7.5, 145.793296], |
['Человек дождя', 1988, 8.25, 133, ['драма'], 25.0, 354.825435], |
] |
# функция для фильтрации таблицы по жанрам |
def filter_by_genre(data, genre): |
result = [] |
for row in data: |
genres = row[4] |
if genre in genres: |
result.append(row) |
return result |
all_genres = [ |
'фантастика', 'драма', 'криминал', 'история', 'комедия', 'биография', |
'триллер', 'военный', 'мелодрама', 'боевик', 'приключения', 'вестерн', |
'детектив', 'ужасы' |
] |
genres_counts = [] |
# В цикле заполняется таблица genres_counts |
for genre in all_genres: |
# отфильтруйте таблицу по жанру genre |
# используйте для этого функцию filter_by_genre() |
filtered_data = filter_by_genre(oscar_data, genre) |
# подсчитайте длину отфильтрованной таблицы |
# используйте для этого функцию len() |
count = len(filtered_data) |
# добавьте название жанра и результат подсчёта в таблицу |
# используйте для этого функцию append() |
genres_counts.append([genre, count]) |
# отсортируйте таблицу по убыванию количества |
# используйте для этого функцию sort() |
# < напишите код здесь > |
genres_counts.sort(key=lambda row: row[1],reverse=True) |
print('Жанр | Количество') |
print('————————') |
for row in genres_counts: |
genre = row[0] |
count = row[1] |
print(' <: <11>| <: >10>'.format(genre, count)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters