├── apps.sqlite ├── README.md ├── ps6_addon_c.ipynb ├── Problem Set 1.ipynb ├── ps8.ipynb ├── Problem Set 4.ipynb ├── ps7.ipynb ├── Problem Set 6.ipynb ├── LICENSE ├── Problem Set 2.ipynb ├── Problem Set 3.ipynb ├── Lecture 9.ipynb └── Problem Set 5.ipynb /apps.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ischurov/pythonhse/HEAD/apps.sqlite -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pythonhse 2 | Это репозиторий для курса «Программирование на языке Python для сбора и анализа данных» (НИУ ВШЭ). 3 | 4 | [Страница курса](http://math-info.hse.ru/s15/m) 5 | -------------------------------------------------------------------------------- /ps6_addon_c.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 9 | "\n", 10 | "Данный notebook является набором задач по курсу \n", 11 | "«Программирование на языке Python для сбора и анализа данных» \n", 12 | "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", 13 | "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).\n", 14 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## Домашнее задание №6, дополнение: задача C\n", 22 | "В связи с технической проблемой, решение задачи C не учитывалось при автоматической проверке ДЗ№6. Если вы сделали эту задачу, пожалуйста, сдайте её отдельно в виде этой микро-домашки. Как обычно, нужно скачать этот ноутбук, внести решение в соответствующее поле и сдать через [систему приёма ДЗ](http://python.math-hse.info)." 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "### Задача C. (1 балл.)\n", 30 | "Написать функцию `get_first_student_grade(students)`, принимающую на вход список `students`, каждый элемент которого является кортежем: первый элемент кортежа является именем студента, а второй его оценкой. Например: `students = [('Bob', 3), ('Alice', 4)]`. Функция должна вернуть оценку студента, имя которого является первым при алфавитной сортировке. (В нашем случае должна вернуть число `4`.) Все студенты имеют разные имена.\n", 31 | "\n", 32 | "**Подсказка.** См. подсказку к задаче B. Возможно, функции `min()` удастся скормить кортежи? Попробуйте! Кстати, задача решается ровно в одну строчку (не считая `def`). Использовать библиотеки нельзя." 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": null, 38 | "metadata": { 39 | "collapsed": true, 40 | "deletable": false, 41 | "nbgrader": { 42 | "checksum": "4b06a19f5a6f5e9f5b3b2e6acb268dbd", 43 | "grade": false, 44 | "grade_id": "prC", 45 | "locked": false, 46 | "solution": true 47 | } 48 | }, 49 | "outputs": [], 50 | "source": [ 51 | "# YOUR CODE HERE" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": null, 57 | "metadata": { 58 | "collapsed": false, 59 | "deletable": false, 60 | "nbgrader": { 61 | "checksum": "1bde310d36dfd5b4e5d9dffdc0bb13b1", 62 | "grade": true, 63 | "grade_id": "prC_t", 64 | "locked": true, 65 | "points": 1, 66 | "solution": false 67 | } 68 | }, 69 | "outputs": [], 70 | "source": [ 71 | "from random import shuffle, seed\n", 72 | "seed(0)\n", 73 | "def shuffle_test(f, inp, outp, n=10):\n", 74 | " for i in range(n):\n", 75 | " shuffle(inp)\n", 76 | " assert f(inp)==outp\n", 77 | "def test(inp,outp, n=10):\n", 78 | " return shuffle_test(get_first_student_grade, inp, outp)\n", 79 | "test([('Bob', 3), ('Alice', 4)], 4)\n", 80 | "test([('Zzz', 1)], 1)\n", 81 | "test([('Haha', 2), ('Hoho', 3), ('Zzz', 4), ('aaaa', 5)], 2)\n", 82 | "\n", 83 | "del shuffle, seed, shuffle_test, test" 84 | ] 85 | } 86 | ], 87 | "metadata": { 88 | "kernelspec": { 89 | "display_name": "Python 3", 90 | "language": "python", 91 | "name": "python3" 92 | }, 93 | "language_info": { 94 | "codemirror_mode": { 95 | "name": "ipython", 96 | "version": 3 97 | }, 98 | "file_extension": ".py", 99 | "mimetype": "text/x-python", 100 | "name": "python", 101 | "nbconvert_exporter": "python", 102 | "pygments_lexer": "ipython3", 103 | "version": "3.5.0" 104 | } 105 | }, 106 | "nbformat": 4, 107 | "nbformat_minor": 0 108 | } -------------------------------------------------------------------------------- /Problem Set 1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 9 | "\n", 10 | "Данный notebook является набором задач по курсу «Программирование на языке Python для сбора и анализа данных» (НИУ ВШЭ, 2014-15). Тексты задач взяты с сайта http://informatics.mccme.ru/. На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 11 | ] 12 | }, 13 | { 14 | "cell_type": "markdown", 15 | "metadata": {}, 16 | "source": [ 17 | "## Домашнее задание №1\n", 18 | "За разные задачи можно получить разное число баллов. Если не указано иного, то задача оценивается в 1 балл. Максимум за ДЗ можно набрать 7 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 7 баллов, чтобы подстраховаться.\n", 19 | "\n", 20 | "### Задача A: Hello, Harry (id 2793)\n", 21 | "Напишите программу, которая запрашивает имя пользователя, а затем приветствует его.\n", 22 | "\n", 23 | "**Входные данные**\n", 24 | "\n", 25 | "Пользователь вводит одно слово латинскими буквами — имя.\n", 26 | "\n", 27 | "**Выходные данные**\n", 28 | "\n", 29 | "Программа должна выводить одну строчку:\n", 30 | "\n", 31 | " Hello, имя!\n", 32 | "\n", 33 | "где имя — введенное пользователем имя. Обратите внимание на пробел после запятой. Других пробелов быть не должно! Запрашивая имя, программа не должна выводить никакого поясняющего текста (типа «Enter your name»)!\n", 34 | "\n", 35 | "**Примеры**\n", 36 | "\n", 37 | "_Входные данные_\n", 38 | "\n", 39 | " Harry\n", 40 | "\n", 41 | "_Выходные данные_\n", 42 | "\n", 43 | " Hello, Harry!\n", 44 | "\n", 45 | "_Входные данные_\n", 46 | "\n", 47 | " Hermiona\n", 48 | "\n", 49 | "_Выходные данные_\n", 50 | "\n", 51 | " Hello, Hermiona!\n", 52 | "\n", 53 | "_Подсказка._ Лишние пробелы? Есть два возможных решения: 1. Попробуйте складывать строки с помощью знака `+` и посмотрите, что получится. (Например, `\"hello\"+\"world\"`?) 2. Мы это не проходили, но скажу по секрету: у функции `print` есть параметр `sep`." 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "### Задача B: Степень двойки (id 3443)\n", 61 | "\n", 62 | "Вычислите $2^{179}$. Выведите на экран вычисленное значение. " 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "### Задача C: Python (id 3449)\n", 70 | "Запишите слово `Python` 100 раз подряд. Сдайте на проверку программу, которая выводит эту строчку (только буквы, без кавычек).\n", 71 | "\n", 72 | "_Подсказка._ Попробуйте умножить строку на число. Что получится?" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "### Задача D: Гипотенуза (id 2936)\n", 80 | "Дано два числа: $a$ и $b$. Найдите гипотенузу треугольника с заданными катетами.\n", 81 | "\n", 82 | "**Входные данные**\n", 83 | "\n", 84 | "В двух строках вводятся два числа (числа целые, положительные, не превышают 1000).\n", 85 | "\n", 86 | "**Выходные данные**\n", 87 | "\n", 88 | "Выведите ответ на задачу.\n", 89 | "\n", 90 | "**Пример**\n", 91 | "\n", 92 | "_Входные данные_\n", 93 | "\n", 94 | " 3\n", 95 | " 4\n", 96 | "\n", 97 | "Выходные данные\n", 98 | "\n", 99 | " 5.0\n" 100 | ] 101 | }, 102 | { 103 | "cell_type": "markdown", 104 | "metadata": {}, 105 | "source": [ 106 | "### Задача E: Делёж яблок (id 2938)\n", 107 | "\n", 108 | "$N$ школьников делят $K$ яблок поровну, неделящийся остаток остается в корзинке. Сколько яблок достанется каждому школьнику?\n", 109 | "\n", 110 | "**Входные данные**\n", 111 | "\n", 112 | "Программа получает на вход числа $N$ и $K$.\n", 113 | "\n", 114 | "**Выходные данные**\n", 115 | "\n", 116 | "Программа должна вывести искомое количество яблок.\n", 117 | "\n", 118 | "**Примеры**\n", 119 | "\n", 120 | "_Входные данные_\n", 121 | "\n", 122 | " 3\n", 123 | " 14\n", 124 | "\n", 125 | "_Выходные данные_\n", 126 | "\n", 127 | " 4" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": {}, 133 | "source": [ 134 | "### Задача F: Следующее и предыдущее (id 2937)\n", 135 | "\n", 136 | "Напишите программу, которая считывает целое число и выводит текст, аналогичный приведенному в примере. Пробелы, знаки препинания, заглавные и строчные буквы важны!\n", 137 | "\n", 138 | "**Входные данные**\n", 139 | "\n", 140 | "Вводится целое число.\n", 141 | "\n", 142 | "**Выходные данные**\n", 143 | "\n", 144 | "Выведите ответ на задачу.\n", 145 | "\n", 146 | "**Пример**\n", 147 | "\n", 148 | "_Входные данные_\n", 149 | "\n", 150 | " 179\n", 151 | "\n", 152 | "_Выходные данные_\n", 153 | "\n", 154 | " The next number for the number 179 is 180.\n", 155 | " The previous number for the number 179 is 178.\n", 156 | "\n", 157 | "_Подсказка._ См. подсказку к задаче A." 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": {}, 163 | "source": [ 164 | "### Задача G: Корень степени 10 (id 3451; 2 балла)\n", 165 | "Число $179^{10}$ записали четыре раза подряд. Из получившегося числа извлекли корень степени 10. Сколько получилось?\n", 166 | "\n", 167 | "_Подсказка._ См. подсказку к задаче C. А ещё бывает функция `str()`!" 168 | ] 169 | }, 170 | { 171 | "cell_type": "markdown", 172 | "metadata": {}, 173 | "source": [ 174 | "### Задача H: Следующее чётное (id 2945; 3 балла)\n", 175 | "\n", 176 | "Дано целое число $n$. Выведите следующее за ним четное число. При решении этой задачи нельзя использовать условный оператор `if` и циклы.\n", 177 | "\n", 178 | "\n", 179 | "**Входные данные**\n", 180 | "\n", 181 | "Вводится целое число.\n", 182 | "\n", 183 | "**Выходные данные**\n", 184 | "\n", 185 | "Выведите ответ на задачу.\n", 186 | "\n", 187 | "**Примеры**\n", 188 | "\n", 189 | "_Входные данные_\n", 190 | "\n", 191 | " 7\n", 192 | "\n", 193 | "_Выходные данные_\n", 194 | "\n", 195 | " 8\n", 196 | "\n", 197 | "_Входные данные_\n", 198 | "\n", 199 | " 8\n", 200 | "\n", 201 | "_Выходные данные_\n", 202 | "\n", 203 | " 10\n" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "### Задача I: сумма цифр (id 3463; 3 балла)\n", 211 | "\n", 212 | "\n", 213 | "Дано трехзначное число. Найдите сумму его цифр.\n", 214 | "\n", 215 | "**Входные данные**\n", 216 | "\n", 217 | "Вводится целое положительное число. Гарантируется, что оно соответствует условию задачи.\n", 218 | "\n", 219 | "**Выходные данные**\n", 220 | "\n", 221 | "Выведите ответ на задачу.\n", 222 | "\n", 223 | "**Пример**\n", 224 | "\n", 225 | "_Входные данные_\n", 226 | "\n", 227 | "179\n", 228 | "\n", 229 | "_Выходные данные_\n", 230 | "\n", 231 | "17" 232 | ] 233 | }, 234 | { 235 | "cell_type": "markdown", 236 | "metadata": {}, 237 | "source": [ 238 | "### Задача J: Электронные часы (id 2948; 4 балла)\n", 239 | "\n", 240 | "\n", 241 | "Электронные часы показывают время в формате h:mm:ss, то есть сначала записывается количество часов, потом обязательно двузначное количество минут, затем обязательно двузначное количество секунд. Количество минут и секунд при необходимости дополняются до двузначного числа нулями.\n", 242 | "\n", 243 | "С начала суток прошло n секунд. Выведите, что покажут часы.\n", 244 | "\n", 245 | "Запрещается пользоваться условным оператором и циклами.\n", 246 | "\n", 247 | "**Входные данные**\n", 248 | "\n", 249 | "Вводится целое число $n$.\n", 250 | "\n", 251 | "**Выходные данные**\n", 252 | "\n", 253 | "Выведите ответ на задачу, соблюдая требуемый формат.\n", 254 | "\n", 255 | "**Примеры**\n", 256 | "\n", 257 | "_Входные данные_\n", 258 | "\n", 259 | " 3602\n", 260 | "\n", 261 | "_Выходные данные_\n", 262 | "\n", 263 | " 1:00:02\n", 264 | "\n", 265 | "_Входные данные_\n", 266 | "\n", 267 | " 129700\n", 268 | "\n", 269 | "_Выходные данные_\n", 270 | "\n", 271 | " 12:01:40\n", 272 | " \n", 273 | "_Подсказка._ См. подсказки к задачам A и G." 274 | ] 275 | }, 276 | { 277 | "cell_type": "markdown", 278 | "metadata": {}, 279 | "source": [ 280 | "### Задача K: Максимум (id 2958; 5 баллов)\n", 281 | "\n", 282 | "\n", 283 | "Напишите программу, которая считывает два целых числа $a$ и $b$ и выводит наибольшее значение из них. Числа — целые от 1 до 1000.\n", 284 | "\n", 285 | "При решении задачи можно пользоваться только целочисленными арифметическими операциями `+, -, *, //, %, =`. Нельзя пользоваться нелинейными конструкциями: ветвлениями, циклами, функциями вычисления модуля, извлечения квадратного корня, возведения в нецелую степень.\n", 286 | "\n", 287 | "Использование функции `max` запрещено! И `min` тоже. И вообще всё запрещено, кроме того, что разрешено.\n", 288 | "\n", 289 | "**Входные данные**\n", 290 | "\n", 291 | "Вводятся два целых числа a и b.\n", 292 | "\n", 293 | "**Выходные данные**\n", 294 | "\n", 295 | "Выведите ответ на задачу.\n", 296 | "\n", 297 | "**Примеры**\n", 298 | "_Входные данные_\n", 299 | "\n", 300 | " 8\n", 301 | " 5\n", 302 | "\n", 303 | "_Выходные данные_\n", 304 | "\n", 305 | " 8\n", 306 | "\n", 307 | "_Входные данные_\n", 308 | "\n", 309 | " 5\n", 310 | " 8\n", 311 | "\n", 312 | "_Выходные данные_\n", 313 | "\n", 314 | " 8\n", 315 | "\n", 316 | "_Входные данные_\n", 317 | "\n", 318 | " 5\n", 319 | " 5\n", 320 | "\n", 321 | "_Выходные данные_\n", 322 | "\n", 323 | " 5" 324 | ] 325 | } 326 | ], 327 | "metadata": { 328 | "kernelspec": { 329 | "display_name": "Python 3", 330 | "language": "python", 331 | "name": "python3" 332 | }, 333 | "language_info": { 334 | "codemirror_mode": { 335 | "name": "ipython", 336 | "version": 3 337 | }, 338 | "file_extension": ".py", 339 | "mimetype": "text/x-python", 340 | "name": "python", 341 | "nbconvert_exporter": "python", 342 | "pygments_lexer": "ipython3", 343 | "version": "3.4.3" 344 | } 345 | }, 346 | "nbformat": 4, 347 | "nbformat_minor": 0 348 | } 349 | -------------------------------------------------------------------------------- /ps8.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 9 | "\n", 10 | "Данный notebook является набором задач по курсу \n", 11 | "«Программирование на языке Python для сбора и анализа данных» \n", 12 | "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", 13 | "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).\n", 14 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## Домашнее задание №8\n", 22 | "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 6 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 6 баллов, чтобы подстраховаться.\n", 23 | "\n", 24 | "Для предварительной проверки задания нужно скачать данный `ipynb`-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. [здесь](http://math-info.hse.ru/2015-16/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%B0_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85#.D0.9A.D0.B0.D0.BA_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D1.8C)) и вставить решение каждой задачи в ячейку для кода, следующую за его условием, запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.\n", 25 | "\n", 26 | "Чтобы сдать ДЗ, его надо будет загрузить в [nbgr-x](http://python.math-hse.info) в виде `ipynb`-файла.\n", 27 | "\n", 28 | "### Библиотеки\n", 29 | "Во всех задачах можно использовать библиотеки `requests` и `BeautifulSoup` (`bs4`)." 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "### Задача 1. (2 балла.)\n", 37 | "Написать функцию `any_news_about_harry(url)`, принимающую на вход адрес веб-страницы `url`, загружающую эту веб-страницу и проверяющую, встречается ли в ней слово `Harry` (с большой буквы). Функция должна возвращать `True`, если встречается, и `False` в противном случае. Также функция должна возвращать `False`, если страницу не удалось открыть (например, была получена ошибка *404 Not Found*.)" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": null, 43 | "metadata": { 44 | "collapsed": false, 45 | "deletable": false, 46 | "nbgrader": { 47 | "checksum": "06e99e37531223f4a5bec3177853393b", 48 | "grade": false, 49 | "grade_id": "pr_1", 50 | "locked": false, 51 | "solution": true 52 | } 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "# YOUR CODE HERE\n", 57 | "raise NotImplementedError()" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "metadata": { 64 | "collapsed": true, 65 | "deletable": false, 66 | "nbgrader": { 67 | "checksum": "208bdfaa408997e34f1f223f654d9c4d", 68 | "grade": true, 69 | "grade_id": "pr_1_1", 70 | "locked": true, 71 | "points": 1, 72 | "solution": false 73 | } 74 | }, 75 | "outputs": [], 76 | "source": [ 77 | "assert any_news_about_harry(\"https://en.wikipedia.org/w/index.php?title=J._K._Rowling&oldid=694008857\")\n", 78 | "assert any_news_about_harry(\"https://en.wikipedia.org/w/index.php?title=Star_Wars&oldid=694701430\")\n", 79 | "assert not any_news_about_harry(\"https://en.wikipedia.org/w/index.php?title=Darth_Vader&oldid=694617684\")" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": null, 85 | "metadata": { 86 | "collapsed": false, 87 | "deletable": false, 88 | "nbgrader": { 89 | "checksum": "b91325c0d076c557b501a08637b82386", 90 | "grade": true, 91 | "grade_id": "pr_1_2", 92 | "locked": true, 93 | "points": 1, 94 | "solution": false 95 | } 96 | }, 97 | "outputs": [], 98 | "source": [ 99 | "assert not any_news_about_harry(\"http://math-info.hse.ru/there_is_no_Harry_here\")" 100 | ] 101 | }, 102 | { 103 | "cell_type": "markdown", 104 | "metadata": {}, 105 | "source": [ 106 | "### Задача 2. (1 балл.)\n", 107 | "Написать функцию `get_strong(html)`, принимающую на вход html-страницу в виде длинной строки, записанной в переменную `html`, и возвращающую строчку, содержащуюся в первом теге `strong`.\n", 108 | "\n", 109 | "Примеры см. в тестах.\n", 110 | "\n", 111 | "**Подсказка.** Вы можете создать объект `BeautifulSoup`, передав ему строку с html в качестве параметра. Например:\n", 112 | "\n", 113 | "```python\n", 114 | "from bs4 import BeautifulSoup\n", 115 | "page = BeautifulSoup(\"

Hello

\", \"html.parser\")\n", 116 | "print(page.p)\n", 117 | "```" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": null, 123 | "metadata": { 124 | "collapsed": true, 125 | "deletable": false, 126 | "nbgrader": { 127 | "checksum": "1f4333fd8a103a40ccd724d7e920196b", 128 | "grade": false, 129 | "grade_id": "pr_2", 130 | "locked": false, 131 | "solution": true 132 | } 133 | }, 134 | "outputs": [], 135 | "source": [ 136 | "# YOUR CODE HERE\n", 137 | "raise NotImplementedError()" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": null, 143 | "metadata": { 144 | "collapsed": false, 145 | "deletable": false, 146 | "nbgrader": { 147 | "checksum": "38ecff3e138a37d667633b3398b51448", 148 | "grade": true, 149 | "grade_id": "pr_2_2", 150 | "locked": true, 151 | "points": 1, 152 | "solution": false 153 | } 154 | }, 155 | "outputs": [], 156 | "source": [ 157 | "assert get_strong(\"

Hello, World!\") == \"World\"\n", 158 | "html = \"\"\"\n", 159 | " \n", 160 | "

\n", 161 | " Hello,\n", 162 | " \n", 163 | " World\n", 164 | " \n", 165 | "

\n", 166 | " \n", 167 | "\"\"\"\n", 168 | "assert get_strong(html).strip() == \"World\"\n", 169 | "assert get_strong(\"

tag <strong> is used in HTML\\n to make letters stronger\") == \"stronger\"\n", 170 | "assert get_strong(\"One\\nTwo\") == \"One\\nTwo\"" 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": {}, 176 | "source": [ 177 | "### Задача 3. (1 балл.)\n", 178 | "Для вставки картинок в HTML используется тег ``, содержащий параметр `src` — адрес файла с картинкой. Например, ``. Написать функцию `all_images_src(html)`, принимающую на вход длинную строчку с HTML-документом, а возвращающую список адресов всех картинок, встречающихся в этом документе (в том порядке, в котором они встречаются в документе)." 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": null, 184 | "metadata": { 185 | "collapsed": true, 186 | "deletable": false, 187 | "nbgrader": { 188 | "checksum": "148c01d925f6070802007d7eda423912", 189 | "grade": false, 190 | "grade_id": "pr_3", 191 | "locked": false, 192 | "solution": true 193 | } 194 | }, 195 | "outputs": [], 196 | "source": [ 197 | "# YOUR CODE HERE\n", 198 | "raise NotImplementedError()" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": null, 204 | "metadata": { 205 | "collapsed": false, 206 | "deletable": false, 207 | "nbgrader": { 208 | "checksum": "4a5f42498bed88531a56ed2725f35447", 209 | "grade": true, 210 | "grade_id": "pr_3_t", 211 | "locked": true, 212 | "points": 1, 213 | "solution": false 214 | } 215 | }, 216 | "outputs": [], 217 | "source": [ 218 | "assert all_images_src('') == [\"https://upload.wikimedia.org/wikipedia/commons/b/bd/Struthio_camelus_portrait_Whipsnade_Zoo.jpg\"]\n", 219 | "assert all_images_src( ('\\n'\n", 220 | " '

Some text\\n'\n", 221 | " '\\n'\n", 222 | " '

') ) == [\"test.jpg\", \"well.png\"]\n", 223 | "assert all_images_src('

'\n", 224 | " '\"Just

\"\n", 227 | " ) == ['this is a test.jpg'] + ['img%04i.png' % i for i in range(1000)]" 228 | ] 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "metadata": {}, 233 | "source": [ 234 | "### Задача 4. (2 балла.)\n", 235 | "Написать функцию `get_all_headings(url)`, принимающую на вход адрес страницы в Википедии и возвращающую список, состоящий из названий разделов статьи (в порядке появления в статье). Если такой страницы не существует, функция должна вернуть список, состоящей из строки `\"Not found\"`." 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": null, 241 | "metadata": { 242 | "collapsed": true, 243 | "deletable": false, 244 | "nbgrader": { 245 | "checksum": "fd6e3f0870bd33b6b251c44398cd1d15", 246 | "grade": false, 247 | "grade_id": "pr_4", 248 | "locked": false, 249 | "solution": true 250 | } 251 | }, 252 | "outputs": [], 253 | "source": [ 254 | "# YOUR CODE HERE\n", 255 | "raise NotImplementedError()" 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": null, 261 | "metadata": { 262 | "collapsed": false, 263 | "deletable": false, 264 | "nbgrader": { 265 | "checksum": "acceb082acb8aac95855c7e052b86f98", 266 | "grade": true, 267 | "grade_id": "pr_4_t", 268 | "locked": true, 269 | "points": 2, 270 | "solution": false 271 | } 272 | }, 273 | "outputs": [], 274 | "source": [ 275 | "from urllib.parse import urlencode\n", 276 | "entrypoint = \"https://ru.wikipedia.org/w/index.php?\"\n", 277 | "def mkurl(title, oldid):\n", 278 | " return entrypoint+urlencode(dict(title=title, oldid=oldid))\n", 279 | "assert get_all_headings(mkurl(\"Северовирджинская кампания\",75043192)) == ['Предыстория',\n", 280 | " 'Силы сторон',\n", 281 | " 'Сражения',\n", 282 | " 'Последствия',\n", 283 | " 'Примечания',\n", 284 | " 'Литература',\n", 285 | " 'Ссылки']\n", 286 | "\n", 287 | "assert get_all_headings(mkurl('User:Ilya_Voyager/sandbox/h2test',\"75055744\")) == ['Заголовок', 'Ещё один заголовок', 'Третий заголовок']\n", 288 | "assert get_all_headings(mkurl('User:Ilya_Voyager/This Page Will Never Exist', \"\")) == [\"Not found\"]\n", 289 | "del urlencode, mkurl" 290 | ] 291 | }, 292 | { 293 | "cell_type": "markdown", 294 | "metadata": {}, 295 | "source": [ 296 | "### Задача 5. (4 балла)\n", 297 | "Написать функцию `city_site(name)`, принимающую на вход название города и возвращающую строку, содержащую адрес официального сайта этого города, согласно русской Википедии. Если такого города Википедия не знает, или если у города нет сайта, вернуть `None`.\n", 298 | "\n", 299 | "Предполагается, что вы будете решать эту задачу, обрабатывая HTML-код веб-страницы, а не исходный код статей, и не будете пользоваться сторонними библиотеками (кроме `urllib`, `requests`, `BeautifulSoup`).\n", 300 | "\n", 301 | "**Подсказка.** Как сформировать адрес страницы, зная название статьи, можно подсмотреть в тесте к задаче 4. Впрочем, можно передать адрес страницы напрямую в `requests.get`, см. [официальную документацию](http://docs.python-requests.org/en/latest/user/quickstart/#passing-parameters-in-urls)." 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": null, 307 | "metadata": { 308 | "collapsed": true, 309 | "deletable": false, 310 | "nbgrader": { 311 | "checksum": "5cf4041787597944249f522b76ca99ee", 312 | "grade": false, 313 | "grade_id": "pr_5", 314 | "locked": false, 315 | "solution": true 316 | } 317 | }, 318 | "outputs": [], 319 | "source": [ 320 | "# YOUR CODE HERE\n", 321 | "raise NotImplementedError()" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": null, 327 | "metadata": { 328 | "collapsed": false, 329 | "deletable": false, 330 | "nbgrader": { 331 | "checksum": "2d1d6fa36a253e07aa3560d767fb2f1d", 332 | "grade": true, 333 | "grade_id": "pr_5_1", 334 | "locked": true, 335 | "points": 4, 336 | "solution": false 337 | } 338 | }, 339 | "outputs": [], 340 | "source": [ 341 | "res = [('Абакан', 'http://абакан.рф/'), \n", 342 | " ('Анадырь', None), \n", 343 | " ('Киров (Кировская область)', 'http://www.mo-kirov.ru'), \n", 344 | " ('Южно-Сахалинск', 'http://yuzhno-sakh.ru/'), \n", 345 | " ('Усть-Каменоустюгск', None)]\n", 346 | "for city, site in res:\n", 347 | " assert city_site(city) == site" 348 | ] 349 | }, 350 | { 351 | "cell_type": "code", 352 | "execution_count": null, 353 | "metadata": { 354 | "collapsed": true 355 | }, 356 | "outputs": [], 357 | "source": [] 358 | } 359 | ], 360 | "metadata": { 361 | "kernelspec": { 362 | "display_name": "Python 3", 363 | "language": "python", 364 | "name": "python3" 365 | }, 366 | "language_info": { 367 | "codemirror_mode": { 368 | "name": "ipython", 369 | "version": 3 370 | }, 371 | "file_extension": ".py", 372 | "mimetype": "text/x-python", 373 | "name": "python", 374 | "nbconvert_exporter": "python", 375 | "pygments_lexer": "ipython3", 376 | "version": "3.5.0" 377 | } 378 | }, 379 | "nbformat": 4, 380 | "nbformat_minor": 0 381 | } -------------------------------------------------------------------------------- /Problem Set 4.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "nbgrader": { 7 | "grade": false, 8 | "locked": false, 9 | "solution": false 10 | } 11 | }, 12 | "source": [ 13 | "# Программирование на языке Python для сбора и анализа данных\n", 14 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 15 | "\n", 16 | "Данный notebook является набором задач по курсу \n", 17 | "«Программирование на языке Python для сбора и анализа данных» \n", 18 | "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", 19 | "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru) (кроме \n", 20 | "задач, про которые сказано обратное) \n", 21 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "## Домашнее задание №4\n", 29 | "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 10 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 10 баллов, чтобы подстраховаться.\n", 30 | "\n", 31 | "Для предварительной проверки задания нужно скачать данный `ipynb`-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. [здесь](http://math-info.hse.ru/2015-16/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%B0_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85#.D0.9A.D0.B0.D0.BA_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D1.8C)) и вставить решение каждой задачи в ячейку для кода, следующую за его условием, запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и задачу нужно решить заново.\n", 32 | "\n", 33 | "Чтобы сдать ДЗ, его надо будет загрузить на сервер в виде `ipynb`-файла. Куда загрузить — мы скажем дополнительно чуть позже." 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "### Задача A (1 балл).\n", 41 | "Написать функцию `times2(x)`, принимающую на вход число `x` и возвращающую это число, увеличенное в два раза." 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": null, 47 | "metadata": { 48 | "collapsed": true, 49 | "deletable": false, 50 | "nbgrader": { 51 | "checksum": "30753474fba3b5dc227bd97cc078a883", 52 | "grade": false, 53 | "grade_id": "prA", 54 | "locked": false, 55 | "solution": true 56 | } 57 | }, 58 | "outputs": [], 59 | "source": [ 60 | "# Внесите решение в эту ячейку" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "metadata": { 67 | "collapsed": false, 68 | "deletable": false, 69 | "nbgrader": { 70 | "checksum": "e1409765d8f545286d147be9102b054b", 71 | "grade": true, 72 | "grade_id": "prA_t1", 73 | "locked": true, 74 | "points": 1, 75 | "solution": false 76 | } 77 | }, 78 | "outputs": [], 79 | "source": [ 80 | "assert(times2(1) == 2)\n", 81 | "assert(times2(2) == 4)\n", 82 | "assert(times2(-2) == -4)\n", 83 | "assert(times2(0) == 0)\n", 84 | "assert(times2(100) == 200)" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": {}, 90 | "source": [ 91 | "### Задача B (1 балла).\n", 92 | "Написать функцию `is_odd(n)`, проверяющую, является ли данное число `n` нечётным. Она должна возвращать `True`, если число нечётное, и `False`, если чётное." 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": null, 98 | "metadata": { 99 | "collapsed": true, 100 | "deletable": false, 101 | "nbgrader": { 102 | "checksum": "a082c675342dd11c06f79bece8ff4916", 103 | "grade": false, 104 | "grade_id": "prB", 105 | "locked": false, 106 | "solution": true 107 | } 108 | }, 109 | "outputs": [], 110 | "source": [ 111 | "# Внесите решение в эту ячейку" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "metadata": { 118 | "collapsed": false, 119 | "deletable": false, 120 | "nbgrader": { 121 | "checksum": "a63b6bd484f06e68c9cb4ec6c8a6d5c0", 122 | "grade": true, 123 | "grade_id": "prB_t1", 124 | "locked": true, 125 | "points": 1, 126 | "solution": false 127 | } 128 | }, 129 | "outputs": [], 130 | "source": [ 131 | "assert(is_odd(1))\n", 132 | "assert(not is_odd(2))\n", 133 | "assert(not is_odd(0))\n", 134 | "assert(is_odd(101))" 135 | ] 136 | }, 137 | { 138 | "cell_type": "markdown", 139 | "metadata": {}, 140 | "source": [ 141 | "### Задача C (1 балл).\n", 142 | "Написать функцию `hello(n)`, выводящую на экран строчку `Hello` `n` раз подряд и ничего не возвращающую. Например, вызов `hello(3)` должен привести к выводу на экран\n", 143 | "```\n", 144 | "Hello\n", 145 | "Hello\n", 146 | "Hello\n", 147 | "```" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": null, 153 | "metadata": { 154 | "collapsed": true, 155 | "deletable": false, 156 | "nbgrader": { 157 | "checksum": "3b6b261c28ea801af124f3f692e1d2af", 158 | "grade": false, 159 | "grade_id": "prC", 160 | "locked": false, 161 | "solution": true 162 | } 163 | }, 164 | "outputs": [], 165 | "source": [ 166 | "# Внесите решение в эту ячейку" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": null, 172 | "metadata": { 173 | "collapsed": false, 174 | "deletable": false, 175 | "nbgrader": { 176 | "checksum": "51f0ebd8a5d6443555beb281946b4f02", 177 | "grade": true, 178 | "grade_id": "prC_t1", 179 | "locked": true, 180 | "points": 1, 181 | "solution": false 182 | } 183 | }, 184 | "outputs": [], 185 | "source": [ 186 | "buffer = []\n", 187 | "passed = True\n", 188 | "def print(*args, end = \"\\n\", sep=\" \"):\n", 189 | " buffer.append(sep.join(map(str,args))+end)\n", 190 | "def my_assert(q):\n", 191 | " global passed\n", 192 | " if not q:\n", 193 | " passed = False\n", 194 | "def test_hello(n):\n", 195 | " buffer[:]=[]\n", 196 | " s = hello(n)\n", 197 | " my_assert(s == None)\n", 198 | " my_assert(\"\".join(buffer).strip()==(\"Hello\\n\"*n).strip())\n", 199 | " buffer[:]=[]\n", 200 | "test_hello(3)\n", 201 | "test_hello(10)\n", 202 | "test_hello(151)\n", 203 | "del(print)\n", 204 | "assert(passed)" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "metadata": {}, 210 | "source": [ 211 | "### Задача D. (2 балла)\n", 212 | "Написать функцию `num_div(n)`, вычисляющую, сколько у данного числа `n` делителей (включая 1 и само это число). Функция должна работать с целыми положительными числами." 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": null, 218 | "metadata": { 219 | "collapsed": false, 220 | "deletable": false, 221 | "nbgrader": { 222 | "checksum": "33c25446694de5941c63f2c648c719f0", 223 | "grade": false, 224 | "grade_id": "prD", 225 | "locked": false, 226 | "solution": true 227 | } 228 | }, 229 | "outputs": [], 230 | "source": [ 231 | "# Внесите решение в эту ячейку" 232 | ] 233 | }, 234 | { 235 | "cell_type": "code", 236 | "execution_count": null, 237 | "metadata": { 238 | "collapsed": true, 239 | "deletable": false, 240 | "nbgrader": { 241 | "checksum": "c925af09b58a39235f7c3f5defa8179c", 242 | "grade": true, 243 | "grade_id": "prD_t1", 244 | "locked": true, 245 | "points": 2, 246 | "solution": false 247 | } 248 | }, 249 | "outputs": [], 250 | "source": [ 251 | "assert(num_div(1) == 1)\n", 252 | "assert(num_div(2) == 2)\n", 253 | "assert(num_div(3) == 2)\n", 254 | "assert(num_div(100) == 9)\n", 255 | "assert(num_div(1000) == 16)\n", 256 | "assert(num_div(139) == 2)\n", 257 | "assert(num_div(1289237) == 2)" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "### Задача E (1 балл).\n", 265 | "Написать функцию `is_prime(n)`, проверяющую, является ли данное число `n` простым. Она должна возвращать `True`, если число является простым, и `False` в противном случае. **Примечание.** Можете использовать ранее написанную функцию `num_div(n)`. (**Вопрос:** Является ли это самым эффективным способом решения данной задачи?)" 266 | ] 267 | }, 268 | { 269 | "cell_type": "code", 270 | "execution_count": null, 271 | "metadata": { 272 | "collapsed": true, 273 | "deletable": false, 274 | "nbgrader": { 275 | "checksum": "0492be7632b5df940619fe703abcf50a", 276 | "grade": false, 277 | "grade_id": "prE", 278 | "locked": false, 279 | "solution": true 280 | } 281 | }, 282 | "outputs": [], 283 | "source": [ 284 | "# Внесите решение в эту ячейку" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": null, 290 | "metadata": { 291 | "collapsed": false, 292 | "deletable": false, 293 | "nbgrader": { 294 | "checksum": "5227acc13b0db6a0c6fb30cbb65b838e", 295 | "grade": true, 296 | "grade_id": "prE_t1", 297 | "locked": true, 298 | "points": 1, 299 | "solution": false 300 | } 301 | }, 302 | "outputs": [], 303 | "source": [ 304 | "assert(is_prime(2) and \n", 305 | " is_prime(3) and \n", 306 | " is_prime(139) and \n", 307 | " is_prime(617) and \n", 308 | " is_prime(293) and \n", 309 | " not is_prime(12) and \n", 310 | " not is_prime(13*7))" 311 | ] 312 | }, 313 | { 314 | "cell_type": "markdown", 315 | "metadata": {}, 316 | "source": [ 317 | "### Задача F. (2 балла)\n", 318 | "Написать функцию `med3(x,y,z)`, возвращающую медиану из чисел `x`, `y`, `z` (то есть то из этих чисел, которое будет стоять посередине, если их упорядочить). Пользоваться какими-либо библиотечными функциями нельзя!" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": null, 324 | "metadata": { 325 | "collapsed": false, 326 | "deletable": false, 327 | "nbgrader": { 328 | "checksum": "6ff34977b819abcd9216c5eaef1af98f", 329 | "grade": false, 330 | "grade_id": "prF", 331 | "locked": false, 332 | "solution": true 333 | } 334 | }, 335 | "outputs": [], 336 | "source": [ 337 | "# Внесите решение в эту ячейку" 338 | ] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": null, 343 | "metadata": { 344 | "collapsed": false, 345 | "deletable": false, 346 | "nbgrader": { 347 | "checksum": "afc6868363c0028e79b6c119ab4c7bfc", 348 | "grade": true, 349 | "grade_id": "prF_t1", 350 | "locked": true, 351 | "points": 2, 352 | "solution": false 353 | } 354 | }, 355 | "outputs": [], 356 | "source": [ 357 | "from itertools import permutations\n", 358 | "def test_med3(x,y,z,m):\n", 359 | " for t in permutations([x,y,z]):\n", 360 | " assert(med3(*t) == m)\n", 361 | "test_med3(1,1,1,1)\n", 362 | "test_med3(1,1,2,1)\n", 363 | "test_med3(1,2,2,2)\n", 364 | "test_med3(1,2,3,2)\n", 365 | "test_med3(0,1,2,1)\n", 366 | "test_med3(100,200,300,200)\n", 367 | "test_med3(100,101,1000,101)" 368 | ] 369 | }, 370 | { 371 | "cell_type": "markdown", 372 | "metadata": {}, 373 | "source": [ 374 | "### Задача G. (2 балла)\n", 375 | "Написать функцию `mean(x1,x2,…)`, принимающую на вход несколько чисел и возвращающую их среднее арифметическое." 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": null, 381 | "metadata": { 382 | "collapsed": true, 383 | "deletable": false, 384 | "nbgrader": { 385 | "checksum": "926672a6bb12c62cd4b313496eb9a57c", 386 | "grade": false, 387 | "grade_id": "prG", 388 | "locked": false, 389 | "solution": true 390 | } 391 | }, 392 | "outputs": [], 393 | "source": [ 394 | "# Внесите решение в эту ячейку" 395 | ] 396 | }, 397 | { 398 | "cell_type": "code", 399 | "execution_count": null, 400 | "metadata": { 401 | "collapsed": true, 402 | "deletable": false, 403 | "nbgrader": { 404 | "checksum": "842ce17240cff479862f92e1934a7972", 405 | "grade": true, 406 | "grade_id": "prG_t1", 407 | "locked": true, 408 | "points": 2, 409 | "solution": false 410 | } 411 | }, 412 | "outputs": [], 413 | "source": [ 414 | "assert(mean(1) == 1)\n", 415 | "assert(mean(1,2,3) == 2)\n", 416 | "assert(mean(1,5, 8, 12) == 6.5)\n", 417 | "assert(mean(8, 9, 1, 2, 3, 11, 15) == 7.)" 418 | ] 419 | }, 420 | { 421 | "cell_type": "markdown", 422 | "metadata": {}, 423 | "source": [ 424 | "### Задача H. (3 балла)\n", 425 | "(Источник: informatics.mccme.ru.) Написать функцию `second_occurance(s)`, принимающую на вход строку `s` и возвращающую индекс **второго** вхождения символа `'f'`. Если символ `'f'` в данной строке встречается только один раз, функция должна вернуть число -1, а если не встречается ни разу, функция должна вернуть число -2." 426 | ] 427 | }, 428 | { 429 | "cell_type": "code", 430 | "execution_count": null, 431 | "metadata": { 432 | "collapsed": true, 433 | "deletable": false, 434 | "nbgrader": { 435 | "checksum": "d0f8e14022a765d1cc4f91af37ea2ca8", 436 | "grade": false, 437 | "grade_id": "prH", 438 | "locked": false, 439 | "solution": true 440 | } 441 | }, 442 | "outputs": [], 443 | "source": [ 444 | "# Внесите решение в эту ячейку" 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "execution_count": null, 450 | "metadata": { 451 | "collapsed": false, 452 | "deletable": false, 453 | "nbgrader": { 454 | "checksum": "a2dba37f6c19bd1da79da3bcb53bb8fd", 455 | "grade": true, 456 | "grade_id": "prH_t1", 457 | "locked": true, 458 | "points": 3, 459 | "solution": false 460 | } 461 | }, 462 | "outputs": [], 463 | "source": [ 464 | "assert(second_occurance(\"comfort\") == -1)\n", 465 | "assert(second_occurance(\"coffee\") == 3)\n", 466 | "assert(second_occurance(\"qwerty\") == -2)\n", 467 | "assert(second_occurance(\"f\") == -1)\n", 468 | "assert(second_occurance(\"oooooooooooooooooof\") == -1)\n", 469 | "assert(second_occurance(\"ff\") == 1)\n", 470 | "assert(second_occurance(\"foooooooooooooof\") == 15)\n", 471 | "assert(second_occurance(\"oooooooooooooff\") == 14)\n", 472 | "assert(second_occurance(\"ofofofofofofofofo\") == 3)" 473 | ] 474 | }, 475 | { 476 | "cell_type": "markdown", 477 | "metadata": {}, 478 | "source": [ 479 | "### Задача J. (3 балла)\n", 480 | "Написать функцию `is_increasing(L, strict)`, проверяющую, является ли список `L` монотонно возрастающим/неубывающим. Если параметр `strict` установлен в `True`, то следует осуществить проверку на строгое возрастание (то есть функция должна возвращать `True` только если каждый следующий элемент списка строго больше предыдущего). Если параметр `strict` установлен в `False`, то функция должна проверять неубывание списка, то есть функция должна возвращать `True` если каждый следующий элемент списка не меньше предыдущего. Если параметр `strict` не установлен (функции передан только один параметр), то нужно проводить проверку на строгое возрастание." 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": null, 486 | "metadata": { 487 | "collapsed": true, 488 | "deletable": false, 489 | "nbgrader": { 490 | "checksum": "e025acc4e768a4e1328005075c068f89", 491 | "grade": false, 492 | "grade_id": "prJ", 493 | "locked": false, 494 | "solution": true 495 | } 496 | }, 497 | "outputs": [], 498 | "source": [ 499 | "# Внесите решение в эту ячейку" 500 | ] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "execution_count": null, 505 | "metadata": { 506 | "collapsed": false, 507 | "deletable": false, 508 | "nbgrader": { 509 | "checksum": "e8d8307e64987da108c25b8ba5387ca7", 510 | "grade": true, 511 | "grade_id": "prJ_t1", 512 | "locked": true, 513 | "points": 3, 514 | "solution": false 515 | } 516 | }, 517 | "outputs": [], 518 | "source": [ 519 | "assert(is_increasing([1,2,3]))\n", 520 | "assert(is_increasing([1,2,2],False))\n", 521 | "assert(not is_increasing([1,2,2]))\n", 522 | "assert(is_increasing([1,2,5,10,100]))\n", 523 | "assert(is_increasing([1,2,5,10,100],True))\n", 524 | "assert(not is_increasing([2,1]))\n", 525 | "assert(not is_increasing([2,1],True))\n", 526 | "assert(not is_increasing([2,1],False))\n", 527 | "assert(is_increasing([1,2]))\n", 528 | "assert(is_increasing([1,2], True))\n", 529 | "assert(is_increasing([1,2], False))\n", 530 | "assert(is_increasing([0,0], False))\n", 531 | "assert(not is_increasing([0,0], True))\n", 532 | "assert(not is_increasing([1,2,3,4,5,5]))\n", 533 | "assert(not is_increasing([1,1, 2, 3, 4, 5]))" 534 | ] 535 | }, 536 | { 537 | "cell_type": "code", 538 | "execution_count": null, 539 | "metadata": { 540 | "collapsed": true 541 | }, 542 | "outputs": [], 543 | "source": [] 544 | } 545 | ], 546 | "metadata": { 547 | "kernelspec": { 548 | "display_name": "Python 3", 549 | "language": "python", 550 | "name": "python3" 551 | }, 552 | "language_info": { 553 | "codemirror_mode": { 554 | "name": "ipython", 555 | "version": 3 556 | }, 557 | "file_extension": ".py", 558 | "mimetype": "text/x-python", 559 | "name": "python", 560 | "nbconvert_exporter": "python", 561 | "pygments_lexer": "ipython3", 562 | "version": "3.5.0" 563 | } 564 | }, 565 | "nbformat": 4, 566 | "nbformat_minor": 0 567 | } 568 | -------------------------------------------------------------------------------- /ps7.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 9 | "\n", 10 | "Данный notebook является набором задач по курсу \n", 11 | "«Программирование на языке Python для сбора и анализа данных» \n", 12 | "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", 13 | "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).\n", 14 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## Домашнее задание №7\n", 22 | "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 6 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 6 баллов, чтобы подстраховаться.\n", 23 | "\n", 24 | "Для предварительной проверки задания нужно скачать данный `ipynb`-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. [здесь](http://math-info.hse.ru/2015-16/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%B0_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85#.D0.9A.D0.B0.D0.BA_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D1.8C)) и вставить решение каждой задачи в ячейку для кода, следующую за его условием, запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.\n", 25 | "\n", 26 | "Чтобы сдать ДЗ, его надо будет загрузить в [nbgr-x](http://python.math-hse.info) в виде `ipynb`-файла." 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "### Задача 1. (1 балл.)\n", 34 | "Написать функцию `swap(my_list)`, меняющую в списке `my_list` первый и последний элемент местами. Измениться должен переданный список, функция не должна ничего возвращать. Гарантируется, что в списке есть хотя бы два элемента." 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": null, 40 | "metadata": { 41 | "collapsed": true, 42 | "deletable": false, 43 | "nbgrader": { 44 | "checksum": "883581a9dce0c37a960da48164c4e804", 45 | "grade": false, 46 | "grade_id": "pr1", 47 | "locked": false, 48 | "solution": true 49 | } 50 | }, 51 | "outputs": [], 52 | "source": [ 53 | "# YOUR CODE HERE" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": null, 59 | "metadata": { 60 | "collapsed": true, 61 | "deletable": false, 62 | "nbgrader": { 63 | "checksum": "bd485fc1cd1f1e346bd96bfc766377c6", 64 | "grade": true, 65 | "grade_id": "pr1_t", 66 | "locked": true, 67 | "points": 1, 68 | "solution": false 69 | } 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "list_1 = [1, 2, 3, 4, 5]\n", 74 | "r = swap(list_1)\n", 75 | "assert list_1 == [5, 2, 3, 4, 1]\n", 76 | "assert r is None\n", 77 | "\n", 78 | "list_2 = ['a','b','cd']\n", 79 | "r = swap(list_2)\n", 80 | "assert list_2 == ['cd', 'b', 'a']\n", 81 | "assert r is None\n", 82 | "\n", 83 | "list_3 = ['hello', 'world']\n", 84 | "r = swap(list_3)\n", 85 | "assert list_3 == ['world', 'hello']\n", 86 | "assert r is None\n", 87 | "\n", 88 | "del r, list_1, list_2, list_3" 89 | ] 90 | }, 91 | { 92 | "cell_type": "markdown", 93 | "metadata": {}, 94 | "source": [ 95 | "### Задача 2. (1 балл.)\n", 96 | "Написать функцию `swapped(my_list, i, j)`, возвращающую такой же список, как `my_list`, но у которого поменяли элемент с индексом `i` и элемент с индексом `j` местами. При этом сам список `my_list` не должен измениться." 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": null, 102 | "metadata": { 103 | "collapsed": true, 104 | "deletable": false, 105 | "nbgrader": { 106 | "checksum": "a93978e42e6491c3ff3e257ef3f541b5", 107 | "grade": false, 108 | "grade_id": "pr_2", 109 | "locked": false, 110 | "solution": true 111 | } 112 | }, 113 | "outputs": [], 114 | "source": [ 115 | "# YOUR CODE HERE" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": null, 121 | "metadata": { 122 | "collapsed": false, 123 | "deletable": false, 124 | "nbgrader": { 125 | "checksum": "72bcea3343e48c849329ce663ee7a436", 126 | "grade": true, 127 | "grade_id": "pr_2_t", 128 | "locked": true, 129 | "points": 1, 130 | "solution": false 131 | } 132 | }, 133 | "outputs": [], 134 | "source": [ 135 | "list_1 = [1, 2, 3, 4, 5]\n", 136 | "list_1_backup = list_1\n", 137 | "r = swapped(list_1, 0, 4)\n", 138 | "assert list_1 == [1, 2, 3, 4, 5]\n", 139 | "assert list_1 is list_1_backup\n", 140 | "assert r == [5, 2, 3, 4, 1]\n", 141 | "\n", 142 | "list_2 = ['a', 'b', 'cd']\n", 143 | "list_2_backup = list_2\n", 144 | "r = swapped(list_2, 0, 2)\n", 145 | "assert list_2 == ['a', 'b', 'cd']\n", 146 | "assert list_2 is list_2_backup\n", 147 | "assert r == ['cd', 'b', 'a']\n", 148 | "\n", 149 | "list_3 = ['hello', 'world']\n", 150 | "list_3_backup = list_3\n", 151 | "r = swapped(list_3, 0, 1)\n", 152 | "assert list_3 == ['hello', 'world']\n", 153 | "assert list_3 is list_3_backup\n", 154 | "assert r == ['world', 'hello']\n", 155 | "\n", 156 | "my_list = [1, 2, 3, 4, 5]\n", 157 | "my_list_backup = my_list\n", 158 | "r = swapped(my_list, 1, 2)\n", 159 | "assert my_list == [1, 2, 3, 4, 5]\n", 160 | "assert my_list_backup is my_list\n", 161 | "assert r == [1, 3, 2, 4, 5]\n", 162 | "\n", 163 | "my_list = [1, 2, 3, 4, 5]\n", 164 | "my_list_backup = my_list\n", 165 | "r = swapped(my_list, 3, 3)\n", 166 | "assert my_list == [1, 2, 3, 4, 5]\n", 167 | "assert my_list_backup is my_list\n", 168 | "assert r == [1, 2, 3, 4, 5]\n", 169 | "\n", 170 | "del list_1, list_2, list_3, r" 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": { 176 | "nbgrader": { 177 | "grade": false, 178 | "locked": false, 179 | "solution": false 180 | } 181 | }, 182 | "source": [ 183 | "### Задача 3. (2 балла.)\n", 184 | "Написать функцию `swap_columns(table, i, j)`, принимающую на вход таблицу `table` в виде списка списков, записанную по строчкам (то есть каждым элементом списка `table` является список, задающий строку таблицы) и два индекса `i` и `j`. Функция должна поменять в таблице местами столбец `i` и столбец `j` (нумерация столбцов начинается с нуля). Замена должна производиться в самой переданной таблице `table`. Функция не должна ничего возвращать." 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": null, 190 | "metadata": { 191 | "collapsed": false, 192 | "deletable": false, 193 | "nbgrader": { 194 | "checksum": "8c983e41b2ba4fba5c317a154a59858b", 195 | "grade": false, 196 | "grade_id": "pr_3", 197 | "locked": false, 198 | "solution": true 199 | } 200 | }, 201 | "outputs": [], 202 | "source": [ 203 | "# YOUR CODE HERE" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": null, 209 | "metadata": { 210 | "collapsed": false, 211 | "deletable": false, 212 | "nbgrader": { 213 | "checksum": "03b763bd79fe1e36438cb193953d8eea", 214 | "grade": true, 215 | "grade_id": "pr_3_t", 216 | "locked": true, 217 | "points": 2, 218 | "solution": false 219 | } 220 | }, 221 | "outputs": [], 222 | "source": [ 223 | "table = [[1, 2, 3], [4, 5, 6]]\n", 224 | "r = swap_columns(table, 0, 1)\n", 225 | "assert r is None\n", 226 | "assert table == [[2, 1, 3], [5, 4, 6]]\n", 227 | "\n", 228 | "table = [[1, 2, 3], [4, 5, 6]]\n", 229 | "r = swap_columns(table, 1, 0)\n", 230 | "assert r is None\n", 231 | "assert table == [[2, 1, 3], [5, 4, 6]]\n", 232 | "\n", 233 | "table = [[1, 2, 3], [4, 5, 6]]\n", 234 | "r = swap_columns(table, 1, 2)\n", 235 | "assert r is None\n", 236 | "assert table == [[1, 3, 2], [4, 6, 5]]\n", 237 | "\n", 238 | "table = [[1, 2, 3], [4, 5, 6]]\n", 239 | "r = swap_columns(table, 2, 1)\n", 240 | "assert r is None\n", 241 | "assert table == [[1, 3, 2], [4, 6, 5]]\n", 242 | "\n", 243 | "table = [['a', 'b', 'cd', 'e']]\n", 244 | "r = swap_columns(table, 2, 1)\n", 245 | "assert r is None\n", 246 | "assert table == [['a', 'cd', 'b', 'e']]\n", 247 | "\n", 248 | "table = [[1], [2], [3], [4]]\n", 249 | "r = swap_columns(table, 0, 0)\n", 250 | "assert r is None\n", 251 | "assert table == [[1], [2], [3], [4]]" 252 | ] 253 | }, 254 | { 255 | "cell_type": "markdown", 256 | "metadata": {}, 257 | "source": [ 258 | "### Задача 4. (2 балла.)\n", 259 | "Написать функцию `swapped_columns(table, i, j)`, принимающую на вход таблицу `table` в виде списка списков, записанную по строчкам (то есть каждым элементом списка `table` является список, задающий строку таблицы) и два индекса `i` и `j`. Функция должна должна вернуть новую таблицу, совпадающую с `table`, но в которой столбцы `i` и `j` поменялись местами. Исходная таблица `table` не должна измениться (в частности, не должно измениться содержимое её строк). Можно использовать функции, написанные в предыдущих задачах. (Кстати, задача решается в одну строчку.)" 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "execution_count": null, 265 | "metadata": { 266 | "collapsed": true, 267 | "deletable": false, 268 | "nbgrader": { 269 | "checksum": "e2b18d98a37a4c7b671f48e43f995399", 270 | "grade": false, 271 | "grade_id": "pr_4", 272 | "locked": false, 273 | "solution": true 274 | } 275 | }, 276 | "outputs": [], 277 | "source": [ 278 | "# YOUR CODE HERE" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": null, 284 | "metadata": { 285 | "collapsed": true, 286 | "deletable": false, 287 | "nbgrader": { 288 | "checksum": "ecb9e63ce95f0f7ea761c51fcc07c2cf", 289 | "grade": true, 290 | "grade_id": "pr_4_t", 291 | "locked": true, 292 | "points": 2, 293 | "solution": false 294 | } 295 | }, 296 | "outputs": [], 297 | "source": [ 298 | "table = [[1, 2, 3], [4, 5, 6]]\n", 299 | "backup = table[0]\n", 300 | "r = swapped_columns(table, 0, 1)\n", 301 | "assert table == [[1, 2, 3], [4, 5, 6]]\n", 302 | "assert table[0] is backup\n", 303 | "assert r == [[2, 1, 3], [5, 4, 6]]\n", 304 | "\n", 305 | "table = [[1, 2, 3], [4, 5, 6]]\n", 306 | "r = swapped_columns(table, 1, 0)\n", 307 | "assert table == [[1, 2, 3], [4, 5, 6]]\n", 308 | "assert r == [[2, 1, 3], [5, 4, 6]]\n", 309 | "\n", 310 | "table = [[1, 2, 3], [4, 5, 6]]\n", 311 | "r = swapped_columns(table, 1, 2)\n", 312 | "assert table == [[1, 2, 3], [4, 5, 6]]\n", 313 | "assert r == [[1, 3, 2], [4, 6, 5]]\n", 314 | "\n", 315 | "table = [[1, 2, 3], [4, 5, 6]]\n", 316 | "r = swapped_columns(table, 2, 1)\n", 317 | "assert table == [[1, 2, 3], [4, 5, 6]]\n", 318 | "assert r == [[1, 3, 2], [4, 6, 5]]\n", 319 | "\n", 320 | "table = [['a', 'b', 'cd', 'e']]\n", 321 | "r = swapped_columns(table, 2, 1)\n", 322 | "assert table == [['a', 'b', 'cd', 'e']]\n", 323 | "assert r == [['a', 'cd', 'b', 'e']]\n", 324 | "\n", 325 | "table = [[1], [2], [3], [4]]\n", 326 | "r = swapped_columns(table, 0, 0)\n", 327 | "assert table == [[1], [2], [3], [4]]\n", 328 | "assert r == [[1], [2], [3], [4]]" 329 | ] 330 | }, 331 | { 332 | "cell_type": "markdown", 333 | "metadata": { 334 | "nbgrader": { 335 | "grade": false, 336 | "locked": false, 337 | "solution": false 338 | } 339 | }, 340 | "source": [ 341 | "### Задача 5. (1 балл)\n", 342 | "Написать функцию `count_different_words(s)`, принимающую на вход строку `s` и вычисляющую, сколько в ней различных слов. Слова в строке `s` разделены пробелами, знаков препинания нет. Слова считаются разными, если различаются как строки, то есть слова `\"hello\"` и `\"Hello\"` — разные.\n", 343 | "\n", 344 | "**Подсказка:** с помощью множеств задача решается в одну строчку." 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": null, 350 | "metadata": { 351 | "collapsed": true, 352 | "deletable": false, 353 | "nbgrader": { 354 | "checksum": "960ff9a127927506d777d84e0c4e61be", 355 | "grade": false, 356 | "grade_id": "pr_5", 357 | "locked": false, 358 | "solution": true 359 | } 360 | }, 361 | "outputs": [], 362 | "source": [ 363 | "# YOUR CODE HERE" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": null, 369 | "metadata": { 370 | "collapsed": true, 371 | "deletable": false, 372 | "nbgrader": { 373 | "checksum": "72e33f44090bf888c515e62aa89d6d61", 374 | "grade": true, 375 | "grade_id": "pr_5_t", 376 | "locked": true, 377 | "points": 1, 378 | "solution": false 379 | } 380 | }, 381 | "outputs": [], 382 | "source": [ 383 | "assert count_different_words(\"Hello\") == 1\n", 384 | "assert count_different_words(\"Hello World\") == 2\n", 385 | "assert count_different_words(\"Hello Hello\") == 1\n", 386 | "assert count_different_words(\"Hello World Hello\") == 2\n", 387 | "assert count_different_words(\"World Hello World World\") == 2\n", 388 | "assert count_different_words(\"a b c d e f g a b a b f g h\") == 8\n", 389 | "assert count_different_words(\"A B c d e f g a b a b f g h A B\") == 10" 390 | ] 391 | }, 392 | { 393 | "cell_type": "markdown", 394 | "metadata": {}, 395 | "source": [ 396 | "### Задача 6. (1 балл.)\n", 397 | "Написать функцию `censored_test()`, считывающую файл `test.txt` и печатающую его на экран, заменив все вхождения слова `haha` на `[censored]`. Файл `test.txt` должен быть явно закрыт перед выходом из функции!\n", 398 | "\n", 399 | "Пример:\n", 400 | "\n", 401 | "Если в файле test.txt записано\n", 402 | "\n", 403 | " haha test\n", 404 | " another haha haha test\n", 405 | " hahahaha hahahaha\n", 406 | " this is a test\n", 407 | " well\n", 408 | " \n", 409 | "то функция должна напечатать\n", 410 | "\n", 411 | " [censored] test\n", 412 | " another [censored] [censored] test\n", 413 | " [censored][censored] [censored][censored]\n", 414 | " this is a test\n", 415 | " well\n", 416 | "\n", 417 | "\n" 418 | ] 419 | }, 420 | { 421 | "cell_type": "code", 422 | "execution_count": null, 423 | "metadata": { 424 | "collapsed": false, 425 | "deletable": false, 426 | "nbgrader": { 427 | "checksum": "47a4b2ced00e1a4079d54f79f2273ee9", 428 | "grade": false, 429 | "grade_id": "pr_6", 430 | "locked": false, 431 | "solution": true 432 | } 433 | }, 434 | "outputs": [], 435 | "source": [ 436 | "# YOUR CODE HERE" 437 | ] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "execution_count": null, 442 | "metadata": { 443 | "collapsed": false, 444 | "deletable": false, 445 | "nbgrader": { 446 | "checksum": "f0d6def2887da9f2288eed68f7a5fdab", 447 | "grade": true, 448 | "grade_id": "pr_6_t", 449 | "locked": true, 450 | "points": 1, 451 | "solution": false 452 | } 453 | }, 454 | "outputs": [], 455 | "source": [ 456 | "# Very long and esoteric test\n", 457 | "\n", 458 | "import io\n", 459 | "\n", 460 | "test_txt = io.StringIO()\n", 461 | "stdout = io.StringIO()\n", 462 | "\n", 463 | "def get_test_txt():\n", 464 | " return test_txt\n", 465 | "\n", 466 | "def get_stdout():\n", 467 | " return stdout\n", 468 | "\n", 469 | "def open(file, mode = 'r', *args, **kwargs):\n", 470 | " if file == 'test.txt' and mode in ['r', 'rt']:\n", 471 | " return get_test_txt()\n", 472 | " else:\n", 473 | " raise NotImplementedError\n", 474 | "\n", 475 | "def print(*args, file = None, **kwargs):\n", 476 | " if file is None:\n", 477 | " return __builtins__.print(*args, file=get_stdout(), **kwargs)\n", 478 | " else:\n", 479 | " raise NotImplementedError\n", 480 | "\n", 481 | "def myassert(q):\n", 482 | " global open\n", 483 | " global print\n", 484 | " \n", 485 | " if not q:\n", 486 | " del open\n", 487 | " del print\n", 488 | " assert q\n", 489 | " \n", 490 | "def test_censored(inp, outp):\n", 491 | " global test_txt\n", 492 | " global stdout\n", 493 | " \n", 494 | " test_txt = io.StringIO(inp)\n", 495 | " stdout = io.StringIO()\n", 496 | " \n", 497 | " censored_test()\n", 498 | " \n", 499 | " myassert(stdout.getvalue().strip() == outp.strip())\n", 500 | " myassert(test_txt.closed)\n", 501 | "\n", 502 | "test_censored(\n", 503 | " \"haha test\\nanother haha haha test\\nhahahaha hahahaha\\nthis is a test\\nwell\",\n", 504 | " (\"[censored] test\\nanother [censored] [censored] test\\n\"\n", 505 | " \"[censored][censored] [censored][censored]\\nthis is a test\\nwell\")\n", 506 | ")\n", 507 | "\n", 508 | "test_censored(\n", 509 | " (\n", 510 | " \"this is a haha haha haha\\n\"\n", 511 | " \"haha ha ha hahahahahaha ha haha\\n\"\n", 512 | " \"\\n\"\n", 513 | " \"ha\\n\"\n", 514 | " \"ha\\n\"\n", 515 | " \"\\n\"\n", 516 | " \"thisisahahahathis\\n\"\n", 517 | " \"well...\\n\"\n", 518 | " \"\\n\"\n", 519 | " \"Hello, world!\\n\"\n", 520 | " ),\n", 521 | " (\n", 522 | " \"this is a [censored] [censored] [censored]\\n\"\n", 523 | " \"[censored] ha ha [censored][censored][censored] ha [censored]\\n\"\n", 524 | " \"\\n\"\n", 525 | " \"ha\\n\"\n", 526 | " \"ha\\n\"\n", 527 | " \"\\n\"\n", 528 | " \"thisisa[censored]hathis\\n\"\n", 529 | " \"well...\\n\"\n", 530 | " \"\\n\"\n", 531 | " \"Hello, world!\\n\"\n", 532 | " )\n", 533 | ")\n", 534 | "del print\n", 535 | "del open" 536 | ] 537 | } 538 | ], 539 | "metadata": { 540 | "kernelspec": { 541 | "display_name": "Python 3", 542 | "language": "python", 543 | "name": "python3" 544 | }, 545 | "language_info": { 546 | "codemirror_mode": { 547 | "name": "ipython", 548 | "version": 3 549 | }, 550 | "file_extension": ".py", 551 | "mimetype": "text/x-python", 552 | "name": "python", 553 | "nbconvert_exporter": "python", 554 | "pygments_lexer": "ipython3", 555 | "version": "3.5.0" 556 | } 557 | }, 558 | "nbformat": 4, 559 | "nbformat_minor": 0 560 | } -------------------------------------------------------------------------------- /Problem Set 6.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 9 | "\n", 10 | "Данный notebook является набором задач по курсу \n", 11 | "«Программирование на языке Python для сбора и анализа данных» \n", 12 | "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", 13 | "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).\n", 14 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## Домашнее задание №6\n", 22 | "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 8 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 8 баллов, чтобы подстраховаться.\n", 23 | "\n", 24 | "Для предварительной проверки задания нужно скачать данный `ipynb`-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. [здесь](http://math-info.hse.ru/2015-16/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%B0_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85#.D0.9A.D0.B0.D0.BA_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D1.8C)) и вставить решение каждой задачи в ячейку для кода, следующую за его условием, запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.\n", 25 | "\n", 26 | "Чтобы сдать ДЗ, его надо будет загрузить на сервер в виде `ipynb`-файла. Куда загрузить — мы скажем дополнительно чуть позже." 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "nbgrader": { 33 | "grade": false, 34 | "locked": false, 35 | "points": 0, 36 | "solution": false 37 | } 38 | }, 39 | "source": [ 40 | "### Задача A. (2 балла.)\n", 41 | "**Определение.** Написать функцию `median(x1, x2, ...)`, принимающую на вход несколько чисел и возвращающую их [медиану](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%B0_%28%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0%29) (для чётного числа элементов возьмите среднее арифметическое между двумя серединными элементами). Пользоваться библиотечными функциями нельзя!" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": null, 47 | "metadata": { 48 | "collapsed": true, 49 | "deletable": false, 50 | "nbgrader": { 51 | "checksum": "30753474fba3b5dc227bd97cc078a883", 52 | "grade": false, 53 | "grade_id": "prA", 54 | "locked": false, 55 | "solution": true 56 | } 57 | }, 58 | "outputs": [], 59 | "source": [ 60 | "# Внесите решение в эту ячейку" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "metadata": { 67 | "collapsed": false, 68 | "deletable": false, 69 | "nbgrader": { 70 | "checksum": "88640f111a1df4b5e39d4f88c5c2f236", 71 | "grade": true, 72 | "grade_id": "prA_t", 73 | "locked": true, 74 | "points": 2, 75 | "solution": false 76 | } 77 | }, 78 | "outputs": [], 79 | "source": [ 80 | "from random import shuffle, seed\n", 81 | "seed(0)\n", 82 | "def shuffle_test(f, inp, outp, n=10):\n", 83 | " for i in range(n):\n", 84 | " shuffle(inp)\n", 85 | " assert abs(f(*inp)-outp)<1E-15\n", 86 | "def test(inp,outp, n=10):\n", 87 | " return shuffle_test(median, inp, outp)\n", 88 | "\n", 89 | "test([1,2],1.5)\n", 90 | "test([1,2,3], 2)\n", 91 | "test([10,20,30],20)\n", 92 | "test([10,20,30,40], 25)\n", 93 | "test([1, 2, 4, 8, 16], 4)\n", 94 | "test([4],4)\n", 95 | "test([4]*100+[1000],4)\n", 96 | "\n", 97 | "del shuffle, seed, shuffle_test, test" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "### Задача B. (1 балл.)\n", 105 | "Написать функцию `first_str(str1, str2, ...)`, принимающую на вход несколько строчек и возвращающую ту из них, которая будет идти первой при упорядочивании по алфавиту.\n", 106 | "\n", 107 | "**Подсказка.** Хотите отсортировать весь список и взять его первый элемент? Это не самое лучшее решение: для сортировки всего списка понадобится много времени, если он большой, а вас интересует лишь самый «маленький» его элемент. Попробуйте исползовать функцию `min()` — посмотрите, можно ли ей скормить строки вместо чисел. Исползовать библиотеки нельзя." 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": null, 113 | "metadata": { 114 | "collapsed": true, 115 | "deletable": false, 116 | "nbgrader": { 117 | "checksum": "a082c675342dd11c06f79bece8ff4916", 118 | "grade": false, 119 | "grade_id": "prB", 120 | "locked": false, 121 | "solution": true 122 | } 123 | }, 124 | "outputs": [], 125 | "source": [ 126 | "# Внесите решение в эту ячейку" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": null, 132 | "metadata": { 133 | "collapsed": false, 134 | "deletable": false, 135 | "nbgrader": { 136 | "checksum": "6d46bb484aaa28b519a6dd721be3ff8f", 137 | "grade": true, 138 | "grade_id": "prB_t", 139 | "locked": true, 140 | "points": 1, 141 | "solution": false 142 | } 143 | }, 144 | "outputs": [], 145 | "source": [ 146 | "from random import shuffle, seed\n", 147 | "seed(0)\n", 148 | "def shuffle_test(f, inp, outp, n=10):\n", 149 | " for i in range(n):\n", 150 | " shuffle(inp)\n", 151 | " assert f(*inp)==outp\n", 152 | "def test(inp,outp, n=10):\n", 153 | " return shuffle_test(first_str, inp, outp)\n", 154 | "\n", 155 | "test(['Hello'], 'Hello')\n", 156 | "test(['Hello', 'World'], 'Hello')\n", 157 | "test(['hello', 'World'], 'World')\n", 158 | "test(['a','b','c','d','e'], 'a', 20)\n", 159 | "test(['hello']*100+['World'], 'World')\n", 160 | "test(['a', 'aa', 'aaa','aaaa'], 'a')\n", 161 | "\n", 162 | "del shuffle, seed, shuffle_test, test" 163 | ] 164 | }, 165 | { 166 | "cell_type": "markdown", 167 | "metadata": {}, 168 | "source": [ 169 | "### Задача C. (1 балл.)\n", 170 | "Написать функцию `get_first_student_grade(students)`, принимающую на вход список `students`, каждый элемент которого является кортежем: первый элемент кортежа является именем студента, а второй его оценкой. Например: `students = [('Bob', 3), ('Alice', 4)]`. Функция должна вернуть оценку студента, имя которого является первым при алфавитной сортировке. (В нашем случае должна вернуть число `4`.) Все студенты имеют разные имена.\n", 171 | "\n", 172 | "**Подсказка.** См. подсказку к задаче B. Возможно, функции `min()` удастся скормить кортежи? Попробуйте! Кстати, задача решается ровно в одну строчку (не считая `def`). Использовать библиотеки нельзя." 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": null, 178 | "metadata": { 179 | "collapsed": true, 180 | "deletable": false, 181 | "nbgrader": { 182 | "checksum": "3b6b261c28ea801af124f3f692e1d2af", 183 | "grade": false, 184 | "grade_id": "prC", 185 | "locked": false, 186 | "solution": true 187 | } 188 | }, 189 | "outputs": [], 190 | "source": [ 191 | "# Внесите решение в эту ячейку" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": null, 197 | "metadata": { 198 | "collapsed": false 199 | }, 200 | "outputs": [], 201 | "source": [ 202 | "from random import shuffle, seed\n", 203 | "seed(0)\n", 204 | "def shuffle_test(f, inp, outp, n=10):\n", 205 | " for i in range(n):\n", 206 | " shuffle(inp)\n", 207 | " assert f(inp)==outp\n", 208 | "def test(inp,outp, n=10):\n", 209 | " return shuffle_test(get_first_student_grade, inp, outp)\n", 210 | "test([('Bob', 3), ('Alice', 4)], 4)\n", 211 | "test([('Zzz', 1)], 1)\n", 212 | "test([('Haha', 2), ('Hoho', 3), ('Zzz', 4), ('aaaa', 5)], 2)\n", 213 | "\n", 214 | "del shuffle, seed, shuffle_test, test" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": {}, 220 | "source": [ 221 | "### Задача D. (2 балла.)\n", 222 | "Написать функцию `get_name_of_best_student(students)`, принимающую на вход список `students`, каждый элемент которого является кортежем: первый элемент кортежа является именем студента, а второй его оценкой. Например: `students = [('Bob', 3), ('Alice', 4)]`. Функция должна вернуть имя студента с наибольшей оценкой. Если таких студентов несколько, она должна вернуть имя того из них, кто первый встречается в списке `students` (в том порядке, в котором этот список передан). Например, для списка `[('Bob', 4), ('Alice', 4)]` необходимо вернуть `'Bob'`, а для списка `[('Alice', 4), ('Bob', 4)]` вернуть `'Alice'`.\n", 223 | "\n", 224 | "**Подсказка.** У функций `min()` и `max()` есть необязательный параметр `key`, работающий так же, как и у функции `sort()`. К чему бы это? Кстати, задача снова решается в одну строчку (не считая `import` и `def`), без циклов и условных операторов. Можно использовать `import`." 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": null, 230 | "metadata": { 231 | "collapsed": true, 232 | "deletable": false, 233 | "nbgrader": { 234 | "checksum": "33c25446694de5941c63f2c648c719f0", 235 | "grade": false, 236 | "grade_id": "prD", 237 | "locked": false, 238 | "solution": true 239 | } 240 | }, 241 | "outputs": [], 242 | "source": [ 243 | "# Внесите решение в эту ячейку" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": null, 249 | "metadata": { 250 | "collapsed": false, 251 | "deletable": false, 252 | "nbgrader": { 253 | "checksum": "6e4dda6fd258fc7c6aca4e41c60da34d", 254 | "grade": true, 255 | "grade_id": "prD_t", 256 | "locked": true, 257 | "points": 2, 258 | "solution": false 259 | } 260 | }, 261 | "outputs": [], 262 | "source": [ 263 | "assert get_name_of_best_student([('Bob', 4), ('Alice', 4)]) == 'Bob'\n", 264 | "assert get_name_of_best_student([('Alice', 4), ('Bob', 4)]) == 'Alice'\n", 265 | "assert get_name_of_best_student([('Zzz', 3), ('Bob', 4), ('Alice', 4)]) == 'Bob'\n", 266 | "assert get_name_of_best_student([('Alice', 4), ('Zzz', 3), ('Bob', 4)]) == 'Alice'\n", 267 | "assert get_name_of_best_student([('Zzz', 5), ('Bob', 4), ('Alice', 4)]) == 'Zzz'\n", 268 | "assert get_name_of_best_student([('Alice', 4), ('Zzz', 5), ('Bob', 4)]) == 'Zzz'\n", 269 | "assert get_name_of_best_student([('Alice', 4), ('Zzz', 5), ('Bob', 4), ('Zzz', 5)]) == 'Zzz'\n", 270 | "assert get_name_of_best_student([('Alice', 4), ('Zzz', 5), ('Bob', 4), ('Zzz', 3)]) == 'Zzz'\n", 271 | "assert get_name_of_best_student([('Alice', 0)]) == 'Alice'" 272 | ] 273 | }, 274 | { 275 | "cell_type": "markdown", 276 | "metadata": {}, 277 | "source": [ 278 | "### Задача E. (4 балла.)\n", 279 | "Написать функцию `sort_gradebook(gradebook)`, принимающую на вход некую ведомость в виде списка, элементами которого являются списки такого вида: `[first_name, last_name, grade_1, grade_2, ..., grade_n, final_grade]`, где `first_name` — имя студента, `last_name` — его фамилия, `grade_1, ..., grade_n` — оценки студента по контрольным от 1 до n (число n — общее число контрольных, оно одинаковое для конкретного gradebook, но заранее не известно), `final_grade` — итоговая оценка. Функция должна отсортировать `gradebook` следующим образом (и вернуть его отсортированным):\n", 280 | "\n", 281 | "- По итоговой оценке\n", 282 | "- При совпадении итоговой оценки — по оценке за первую контрольную\n", 283 | "- При совпадении всего предыдущего — по оценке за вторую контрольную\n", 284 | "- При совпадении всего предыдущего — по оценке за третью контрольную (и т.д. пока контрольные не закончатся)\n", 285 | "- При совпадении всех оценок — по фамилии\n", 286 | "- При совпадении всех оценок и фамилии — по имени\n", 287 | "\n", 288 | "Примеры см. в тестах.\n", 289 | "\n", 290 | "**Подсказка.** Внимательное чтение конспекта лекции №6 вам поможет." 291 | ] 292 | }, 293 | { 294 | "cell_type": "code", 295 | "execution_count": null, 296 | "metadata": { 297 | "collapsed": false, 298 | "deletable": false, 299 | "nbgrader": { 300 | "checksum": "0492be7632b5df940619fe703abcf50a", 301 | "grade": false, 302 | "grade_id": "prE", 303 | "locked": false, 304 | "solution": true 305 | } 306 | }, 307 | "outputs": [], 308 | "source": [ 309 | "# Внесите решение в эту ячейку" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": null, 315 | "metadata": { 316 | "collapsed": false, 317 | "deletable": false, 318 | "nbgrader": { 319 | "checksum": "d9fa8a2c934835438ff59408671dc3eb", 320 | "grade": true, 321 | "grade_id": "prE_t", 322 | "locked": true, 323 | "points": 4, 324 | "solution": false 325 | } 326 | }, 327 | "outputs": [], 328 | "source": [ 329 | "from itertools import permutations\n", 330 | "def test_sort(inp, outp):\n", 331 | " for i in permutations(inp):\n", 332 | " assert sort_gradebook(list(i)) == outp\n", 333 | "\n", 334 | "test_sort([\n", 335 | " ['Alice', 'Smith', 2, 3, 4],\n", 336 | " ['John', 'Smith', 2, 3, 5]\n", 337 | " ], [\n", 338 | " ['John', 'Smith', 2, 3, 5],\n", 339 | " ['Alice', 'Smith', 2, 3, 4]\n", 340 | "])\n", 341 | "\n", 342 | "test_sort([\n", 343 | " ['Alice', 'Smith', 2, 3, 4],\n", 344 | " ['John', 'Smith', 2, 3, 4]\n", 345 | " ], [\n", 346 | " ['Alice', 'Smith', 2, 3, 4],\n", 347 | " ['John', 'Smith', 2, 3, 4]\n", 348 | "])\n", 349 | "\n", 350 | "test_sort([\n", 351 | " ['Alice', 'Smith', 1, 3, 4],\n", 352 | " ['John', 'Smith', 2, 3, 4]\n", 353 | " ], [\n", 354 | " ['John', 'Smith', 2, 3, 4],\n", 355 | " ['Alice', 'Smith', 1, 3, 4]\n", 356 | "])\n", 357 | "\n", 358 | "test_sort([\n", 359 | " ['Alice', 'Smith', 1, 1, 1, 3, 4],\n", 360 | " ['John', 'Smith', 1, 1, 2, 3, 4]],\n", 361 | " [\n", 362 | " ['John', 'Smith', 1, 1, 2, 3, 4],\n", 363 | " ['Alice', 'Smith', 1, 1, 1, 3, 4]\n", 364 | "])\n", 365 | "\n", 366 | "test_sort([\n", 367 | " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", 368 | " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", 369 | " ['John', 'Smith', 1, 1, 2, 3, 4]], \n", 370 | " [\n", 371 | " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", 372 | " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", 373 | " ['John', 'Smith', 1, 1, 2, 3, 4]\n", 374 | "])\n", 375 | "\n", 376 | "test_sort([\n", 377 | " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", 378 | " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", 379 | " ['John', 'Smith', 2, 1, 2, 3, 4]], \n", 380 | " [\n", 381 | " ['John', 'Smith', 2, 1, 2, 3, 4],\n", 382 | " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", 383 | " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", 384 | "])\n", 385 | "\n", 386 | "del test_sort" 387 | ] 388 | }, 389 | { 390 | "cell_type": "markdown", 391 | "metadata": {}, 392 | "source": [ 393 | "### Задача F. (1 балл.)\n", 394 | "Написать функцию `mail(student, grade, perf)`, возвращающую строку со следующим текстом: `\"Dear ! Your grade is and your performance rate is %\"`. Здесь `student` — имя студента, `grade` — его оценка, являющаяся целым числом, а `perf` — вещественное число, которое необходимо вывести с двумя знаками после точки. Если `perf` целое, оно всё равно должно быть выведено как вещественное число с двумя знаками после точки. (Последний знак процента — это просто знак процента.)" 395 | ] 396 | }, 397 | { 398 | "cell_type": "code", 399 | "execution_count": null, 400 | "metadata": { 401 | "collapsed": true, 402 | "deletable": false, 403 | "nbgrader": { 404 | "checksum": "6ff34977b819abcd9216c5eaef1af98f", 405 | "grade": false, 406 | "grade_id": "prF", 407 | "locked": false, 408 | "solution": true 409 | } 410 | }, 411 | "outputs": [], 412 | "source": [ 413 | "# Внесите решение в эту ячейку" 414 | ] 415 | }, 416 | { 417 | "cell_type": "code", 418 | "execution_count": null, 419 | "metadata": { 420 | "collapsed": false, 421 | "deletable": false, 422 | "nbgrader": { 423 | "checksum": "3dc9c2ec44278ea3332b2ae8212b98c6", 424 | "grade": true, 425 | "grade_id": "prF_t", 426 | "locked": true, 427 | "points": 1, 428 | "solution": false 429 | } 430 | }, 431 | "outputs": [], 432 | "source": [ 433 | "assert mail(\"Nick\", 5, 12) == 'Dear Nick! Your grade is 5 and your performance rate is 12.00%'\n", 434 | "assert mail(\"John\", 4, 22.22) == 'Dear John! Your grade is 4 and your performance rate is 22.22%'\n", 435 | "assert mail(\"Alice\", 12, 1.2345) == 'Dear Alice! Your grade is 12 and your performance rate is 1.23%'\n", 436 | "assert mail(\"Elizabeth\", 14, 1.235) == 'Dear Elizabeth! Your grade is 14 and your performance rate is 1.24%'" 437 | ] 438 | }, 439 | { 440 | "cell_type": "markdown", 441 | "metadata": {}, 442 | "source": [ 443 | "### Задача G. (2 балла.)\n", 444 | "Написать функцию `pi_digits(n)`, возвращающую число $\\pi$ в виде строки с `n` знаками после десятичной точки, где `n` — целое число от 0 до 15.\n", 445 | "\n", 446 | "**Подсказка.** Число `pi` можно импортировать из `math`. " 447 | ] 448 | }, 449 | { 450 | "cell_type": "code", 451 | "execution_count": null, 452 | "metadata": { 453 | "collapsed": true, 454 | "deletable": false, 455 | "nbgrader": { 456 | "checksum": "926672a6bb12c62cd4b313496eb9a57c", 457 | "grade": false, 458 | "grade_id": "prG", 459 | "locked": false, 460 | "solution": true 461 | } 462 | }, 463 | "outputs": [], 464 | "source": [ 465 | "# Внесите решение в эту ячейку" 466 | ] 467 | }, 468 | { 469 | "cell_type": "code", 470 | "execution_count": null, 471 | "metadata": { 472 | "collapsed": false, 473 | "deletable": false, 474 | "nbgrader": { 475 | "checksum": "3cd41c641ec18efdcf6607b740a75a34", 476 | "grade": true, 477 | "grade_id": "prG_t", 478 | "locked": true, 479 | "points": 2, 480 | "solution": false 481 | } 482 | }, 483 | "outputs": [], 484 | "source": [ 485 | "out = ['3', '3.1', '3.14', '3.142', '3.1416', '3.14159', '3.141593', '3.1415927', '3.14159265', \n", 486 | " '3.141592654', '3.1415926536', '3.14159265359', '3.141592653590', '3.1415926535898', \n", 487 | " '3.14159265358979', '3.141592653589793']\n", 488 | "for i,s in enumerate(out):\n", 489 | " assert pi_digits(i) == s" 490 | ] 491 | } 492 | ], 493 | "metadata": { 494 | "kernelspec": { 495 | "display_name": "Python 3", 496 | "language": "python", 497 | "name": "python3" 498 | }, 499 | "language_info": { 500 | "codemirror_mode": { 501 | "name": "ipython", 502 | "version": 3 503 | }, 504 | "file_extension": ".py", 505 | "mimetype": "text/x-python", 506 | "name": "python", 507 | "nbconvert_exporter": "python", 508 | "pygments_lexer": "ipython3", 509 | "version": "3.5.0" 510 | } 511 | }, 512 | "nbformat": 4, 513 | "nbformat_minor": 0 514 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution-ShareAlike 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-ShareAlike 4.0 International Public 58 | License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-ShareAlike 4.0 International Public License ("Public 63 | License"). To the extent this Public License may be interpreted as a 64 | contract, You are granted the Licensed Rights in consideration of Your 65 | acceptance of these terms and conditions, and the Licensor grants You 66 | such rights in consideration of benefits the Licensor receives from 67 | making the Licensed Material available under these terms and 68 | conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. BY-SA Compatible License means a license listed at 88 | creativecommons.org/compatiblelicenses, approved by Creative 89 | Commons as essentially the equivalent of this Public License. 90 | 91 | d. Copyright and Similar Rights means copyright and/or similar rights 92 | closely related to copyright including, without limitation, 93 | performance, broadcast, sound recording, and Sui Generis Database 94 | Rights, without regard to how the rights are labeled or 95 | categorized. For purposes of this Public License, the rights 96 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 | Rights. 98 | 99 | e. Effective Technological Measures means those measures that, in the 100 | absence of proper authority, may not be circumvented under laws 101 | fulfilling obligations under Article 11 of the WIPO Copyright 102 | Treaty adopted on December 20, 1996, and/or similar international 103 | agreements. 104 | 105 | f. Exceptions and Limitations means fair use, fair dealing, and/or 106 | any other exception or limitation to Copyright and Similar Rights 107 | that applies to Your use of the Licensed Material. 108 | 109 | g. License Elements means the license attributes listed in the name 110 | of a Creative Commons Public License. The License Elements of this 111 | Public License are Attribution and ShareAlike. 112 | 113 | h. Licensed Material means the artistic or literary work, database, 114 | or other material to which the Licensor applied this Public 115 | License. 116 | 117 | i. Licensed Rights means the rights granted to You subject to the 118 | terms and conditions of this Public License, which are limited to 119 | all Copyright and Similar Rights that apply to Your use of the 120 | Licensed Material and that the Licensor has authority to license. 121 | 122 | j. Licensor means the individual(s) or entity(ies) granting rights 123 | under this Public License. 124 | 125 | k. Share means to provide material to the public by any means or 126 | process that requires permission under the Licensed Rights, such 127 | as reproduction, public display, public performance, distribution, 128 | dissemination, communication, or importation, and to make material 129 | available to the public including in ways that members of the 130 | public may access the material from a place and at a time 131 | individually chosen by them. 132 | 133 | l. Sui Generis Database Rights means rights other than copyright 134 | resulting from Directive 96/9/EC of the European Parliament and of 135 | the Council of 11 March 1996 on the legal protection of databases, 136 | as amended and/or succeeded, as well as other essentially 137 | equivalent rights anywhere in the world. 138 | 139 | m. You means the individual or entity exercising the Licensed Rights 140 | under this Public License. Your has a corresponding meaning. 141 | 142 | 143 | Section 2 -- Scope. 144 | 145 | a. License grant. 146 | 147 | 1. Subject to the terms and conditions of this Public License, 148 | the Licensor hereby grants You a worldwide, royalty-free, 149 | non-sublicensable, non-exclusive, irrevocable license to 150 | exercise the Licensed Rights in the Licensed Material to: 151 | 152 | a. reproduce and Share the Licensed Material, in whole or 153 | in part; and 154 | 155 | b. produce, reproduce, and Share Adapted Material. 156 | 157 | 2. Exceptions and Limitations. For the avoidance of doubt, where 158 | Exceptions and Limitations apply to Your use, this Public 159 | License does not apply, and You do not need to comply with 160 | its terms and conditions. 161 | 162 | 3. Term. The term of this Public License is specified in Section 163 | 6(a). 164 | 165 | 4. Media and formats; technical modifications allowed. The 166 | Licensor authorizes You to exercise the Licensed Rights in 167 | all media and formats whether now known or hereafter created, 168 | and to make technical modifications necessary to do so. The 169 | Licensor waives and/or agrees not to assert any right or 170 | authority to forbid You from making technical modifications 171 | necessary to exercise the Licensed Rights, including 172 | technical modifications necessary to circumvent Effective 173 | Technological Measures. For purposes of this Public License, 174 | simply making modifications authorized by this Section 2(a) 175 | (4) never produces Adapted Material. 176 | 177 | 5. Downstream recipients. 178 | 179 | a. Offer from the Licensor -- Licensed Material. Every 180 | recipient of the Licensed Material automatically 181 | receives an offer from the Licensor to exercise the 182 | Licensed Rights under the terms and conditions of this 183 | Public License. 184 | 185 | b. Additional offer from the Licensor -- Adapted Material. 186 | Every recipient of Adapted Material from You 187 | automatically receives an offer from the Licensor to 188 | exercise the Licensed Rights in the Adapted Material 189 | under the conditions of the Adapter's License You apply. 190 | 191 | c. No downstream restrictions. You may not offer or impose 192 | any additional or different terms or conditions on, or 193 | apply any Effective Technological Measures to, the 194 | Licensed Material if doing so restricts exercise of the 195 | Licensed Rights by any recipient of the Licensed 196 | Material. 197 | 198 | 6. No endorsement. Nothing in this Public License constitutes or 199 | may be construed as permission to assert or imply that You 200 | are, or that Your use of the Licensed Material is, connected 201 | with, or sponsored, endorsed, or granted official status by, 202 | the Licensor or others designated to receive attribution as 203 | provided in Section 3(a)(1)(A)(i). 204 | 205 | b. Other rights. 206 | 207 | 1. Moral rights, such as the right of integrity, are not 208 | licensed under this Public License, nor are publicity, 209 | privacy, and/or other similar personality rights; however, to 210 | the extent possible, the Licensor waives and/or agrees not to 211 | assert any such rights held by the Licensor to the limited 212 | extent necessary to allow You to exercise the Licensed 213 | Rights, but not otherwise. 214 | 215 | 2. Patent and trademark rights are not licensed under this 216 | Public License. 217 | 218 | 3. To the extent possible, the Licensor waives any right to 219 | collect royalties from You for the exercise of the Licensed 220 | Rights, whether directly or through a collecting society 221 | under any voluntary or waivable statutory or compulsory 222 | licensing scheme. In all other cases the Licensor expressly 223 | reserves any right to collect such royalties. 224 | 225 | 226 | Section 3 -- License Conditions. 227 | 228 | Your exercise of the Licensed Rights is expressly made subject to the 229 | following conditions. 230 | 231 | a. Attribution. 232 | 233 | 1. If You Share the Licensed Material (including in modified 234 | form), You must: 235 | 236 | a. retain the following if it is supplied by the Licensor 237 | with the Licensed Material: 238 | 239 | i. identification of the creator(s) of the Licensed 240 | Material and any others designated to receive 241 | attribution, in any reasonable manner requested by 242 | the Licensor (including by pseudonym if 243 | designated); 244 | 245 | ii. a copyright notice; 246 | 247 | iii. a notice that refers to this Public License; 248 | 249 | iv. a notice that refers to the disclaimer of 250 | warranties; 251 | 252 | v. a URI or hyperlink to the Licensed Material to the 253 | extent reasonably practicable; 254 | 255 | b. indicate if You modified the Licensed Material and 256 | retain an indication of any previous modifications; and 257 | 258 | c. indicate the Licensed Material is licensed under this 259 | Public License, and include the text of, or the URI or 260 | hyperlink to, this Public License. 261 | 262 | 2. You may satisfy the conditions in Section 3(a)(1) in any 263 | reasonable manner based on the medium, means, and context in 264 | which You Share the Licensed Material. For example, it may be 265 | reasonable to satisfy the conditions by providing a URI or 266 | hyperlink to a resource that includes the required 267 | information. 268 | 269 | 3. If requested by the Licensor, You must remove any of the 270 | information required by Section 3(a)(1)(A) to the extent 271 | reasonably practicable. 272 | 273 | b. ShareAlike. 274 | 275 | In addition to the conditions in Section 3(a), if You Share 276 | Adapted Material You produce, the following conditions also apply. 277 | 278 | 1. The Adapter's License You apply must be a Creative Commons 279 | license with the same License Elements, this version or 280 | later, or a BY-SA Compatible License. 281 | 282 | 2. You must include the text of, or the URI or hyperlink to, the 283 | Adapter's License You apply. You may satisfy this condition 284 | in any reasonable manner based on the medium, means, and 285 | context in which You Share Adapted Material. 286 | 287 | 3. You may not offer or impose any additional or different terms 288 | or conditions on, or apply any Effective Technological 289 | Measures to, Adapted Material that restrict exercise of the 290 | rights granted under the Adapter's License You apply. 291 | 292 | 293 | Section 4 -- Sui Generis Database Rights. 294 | 295 | Where the Licensed Rights include Sui Generis Database Rights that 296 | apply to Your use of the Licensed Material: 297 | 298 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 299 | to extract, reuse, reproduce, and Share all or a substantial 300 | portion of the contents of the database; 301 | 302 | b. if You include all or a substantial portion of the database 303 | contents in a database in which You have Sui Generis Database 304 | Rights, then the database in which You have Sui Generis Database 305 | Rights (but not its individual contents) is Adapted Material, 306 | 307 | including for purposes of Section 3(b); and 308 | c. You must comply with the conditions in Section 3(a) if You Share 309 | all or a substantial portion of the contents of the database. 310 | 311 | For the avoidance of doubt, this Section 4 supplements and does not 312 | replace Your obligations under this Public License where the Licensed 313 | Rights include other Copyright and Similar Rights. 314 | 315 | 316 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 317 | 318 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 319 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 320 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 321 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 322 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 323 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 324 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 325 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 326 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 327 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 328 | 329 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 330 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 331 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 332 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 333 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 334 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 335 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 336 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 337 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 338 | 339 | c. The disclaimer of warranties and limitation of liability provided 340 | above shall be interpreted in a manner that, to the extent 341 | possible, most closely approximates an absolute disclaimer and 342 | waiver of all liability. 343 | 344 | 345 | Section 6 -- Term and Termination. 346 | 347 | a. This Public License applies for the term of the Copyright and 348 | Similar Rights licensed here. However, if You fail to comply with 349 | this Public License, then Your rights under this Public License 350 | terminate automatically. 351 | 352 | b. Where Your right to use the Licensed Material has terminated under 353 | Section 6(a), it reinstates: 354 | 355 | 1. automatically as of the date the violation is cured, provided 356 | it is cured within 30 days of Your discovery of the 357 | violation; or 358 | 359 | 2. upon express reinstatement by the Licensor. 360 | 361 | For the avoidance of doubt, this Section 6(b) does not affect any 362 | right the Licensor may have to seek remedies for Your violations 363 | of this Public License. 364 | 365 | c. For the avoidance of doubt, the Licensor may also offer the 366 | Licensed Material under separate terms or conditions or stop 367 | distributing the Licensed Material at any time; however, doing so 368 | will not terminate this Public License. 369 | 370 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 371 | License. 372 | 373 | 374 | Section 7 -- Other Terms and Conditions. 375 | 376 | a. The Licensor shall not be bound by any additional or different 377 | terms or conditions communicated by You unless expressly agreed. 378 | 379 | b. Any arrangements, understandings, or agreements regarding the 380 | Licensed Material not stated herein are separate from and 381 | independent of the terms and conditions of this Public License. 382 | 383 | 384 | Section 8 -- Interpretation. 385 | 386 | a. For the avoidance of doubt, this Public License does not, and 387 | shall not be interpreted to, reduce, limit, restrict, or impose 388 | conditions on any use of the Licensed Material that could lawfully 389 | be made without permission under this Public License. 390 | 391 | b. To the extent possible, if any provision of this Public License is 392 | deemed unenforceable, it shall be automatically reformed to the 393 | minimum extent necessary to make it enforceable. If the provision 394 | cannot be reformed, it shall be severed from this Public License 395 | without affecting the enforceability of the remaining terms and 396 | conditions. 397 | 398 | c. No term or condition of this Public License will be waived and no 399 | failure to comply consented to unless expressly agreed to by the 400 | Licensor. 401 | 402 | d. Nothing in this Public License constitutes or may be interpreted 403 | as a limitation upon, or waiver of, any privileges and immunities 404 | that apply to the Licensor or You, including from the legal 405 | processes of any jurisdiction or authority. 406 | 407 | 408 | ======================================================================= 409 | 410 | Creative Commons is not a party to its public licenses. 411 | Notwithstanding, Creative Commons may elect to apply one of its public 412 | licenses to material it publishes and in those instances will be 413 | considered the "Licensor." Except for the limited purpose of indicating 414 | that material is shared under a Creative Commons public license or as 415 | otherwise permitted by the Creative Commons policies published at 416 | creativecommons.org/policies, Creative Commons does not authorize the 417 | use of the trademark "Creative Commons" or any other trademark or logo 418 | of Creative Commons without its prior written consent including, 419 | without limitation, in connection with any unauthorized modifications 420 | to any of its public licenses or any other arrangements, 421 | understandings, or agreements concerning use of licensed material. For 422 | the avoidance of doubt, this paragraph does not form part of the public 423 | licenses. 424 | 425 | Creative Commons may be contacted at creativecommons.org. 426 | -------------------------------------------------------------------------------- /Problem Set 2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "\n", 9 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 10 | "\n", 11 | "Данный notebook является набором задач по курсу \n", 12 | "«Программирование на языке Python для сбора и анализа данных» \n", 13 | "(НИУ ВШЭ, 2014-15). Тексты задач взяты с сайта http://informatics.mccme.ru/. \n", 14 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы.\n", 15 | " " 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## Домашнее задание №2\n", 23 | "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 14 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 14 баллов, чтобы подстраховаться.\n", 24 | "\n", 25 | "В задачах **A** и **B** вы можете использовать один из двух подходов к решению: либо использовать продвинутые средства Python для работы со списками, как это обсуждалось на лекции (включая срезы, присваивание срезам, метод `insert()`, функцию `del`), либо решать эти задачу «вручную», то есть пользоваться только присваиванием одного элемента списка другому элементу, добавлением элемента в конец с помощью `append()` и удалением элемента из конца с помощью `pop()`. В первом случае вы получите за эти задачи 1 балл, во втором случае (он технически сложнее и требует некоторых размышлений) — 2 балла.\n", 26 | "\n", 27 | "При решении задач **A** и **B** на два балла можно использовать один или два раза `split()` (исключительно для получения входного списка) и один раз `join()` для вывода итогового списка (если вы знаете, что это такое).\n", 28 | "\n", 29 | "### Подсказки\n", 30 | "- У срезов и функции `range` бывает третий аргумент, то есть можно сделать не только `A[1:10]`, но и `A[1:10:3]`, а также `range(1,10,3)`. Посмотрите, что получится.\n", 31 | "- Чтобы превратить строчку `\"1 2 45 hello\"` в список `['1', '2', '45', 'hello']`, можно использовать метод `split()` строки. Например:" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 4, 37 | "metadata": { 38 | "collapsed": false 39 | }, 40 | "outputs": [ 41 | { 42 | "data": { 43 | "text/plain": [ 44 | "['1', '2', '45', 'hello']" 45 | ] 46 | }, 47 | "execution_count": 4, 48 | "metadata": {}, 49 | "output_type": "execute_result" 50 | } 51 | ], 52 | "source": [ 53 | "s = \"1 2 45 hello\"\n", 54 | "s.split()" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": {}, 60 | "source": [ 61 | "### Ограничения\n", 62 | "Во всех задачах **нельзя** использовать функции `sum`, `min`, `max`, а также какие-либо `import`." 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "### [Задача A](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3169) (1-2 балла)\n", 70 | "\n", 71 | "
\n", 72 | "
\n", 73 | "

Дан список целых чисел, число k и значение C. Необходимо вставить в список на позицию с индексом k элемент, равный C, сдвинув все элементы имевшие индекс не менее k вправо.

Посколько при этом количество элементов в списке увеличивается, после считывания списка в его конец нужно будет добавить новый элемент, используя метод `append()`.

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

\n", 74 | "
\n", 75 | "
\n", 76 | "
\n", 77 | " Входные данные\n", 78 | "
\n", 79 | "

Вводится список чисел. Все числа списка находятся на одной строке. На второй строке вводятся числа k и C.

\n", 80 | "
\n", 81 | "
\n", 82 | "
\n", 83 | " Выходные данные\n", 84 | "
\n", 85 | "

Выведите ответ на задачу.

\n", 86 | "
\n", 87 | "
Примеры
Входные данные
7 6 5 4 3 2 1\n",
 88 |     "2 0\n",
 89 |     "
Выходные данные
7 6 0 5 4 3 2 1 \n",
 90 |     "
" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "### [Задача B](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3168) (1-2 балла)\n", 98 | "\n", 99 | "
\n", 100 | "
\n", 101 | "

Дан список из чисел и индекс элемента в списке k. Удалите из списка элемент с индексом k, сдвинув влево все элементы, стоящие правее элемента с индексом k.

\n", 102 | "
\n", 103 | "
\n", 104 | "
\n", 105 | " Входные данные\n", 106 | "
\n", 107 | "

Программа получает на вход список, затем число k. Программа сдвигает все элементы, а после этого удаляет последний элемент списка при помощи метода `pop()`.

Программа должна осуществлять сдвиг непосредственно в списке, а не делать это при выводе элементов. Также нельзя использовать дополнительный список.

\n", 108 | "
\n", 109 | "
\n", 110 | "
\n", 111 | " Выходные данные\n", 112 | "
\n", 113 | "

Выведите ответ на задачу.

\n", 114 | "
\n", 115 | "
Примеры
Входные данные
7 6 5 4 3 2 1\n",
116 |     "2\n",
117 |     "
Выходные данные
7 6 4 3 2 1 \n",
118 |     "
" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "### [Задача C](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3828) (1 балл)\n", 126 | "\n", 127 | "
\n", 128 | "
\n", 129 | "

Выведите все элементы списка с четными индексами\n", 130 | "(то есть A[0], A[2], A[4], ...).

\n", 131 | "

Программа должна быть эффективной и не выполнять лишних действий!

\n", 132 | "
\n", 133 | "
\n", 134 | "
\n", 135 | " Входные данные\n", 136 | "
\n", 137 | "

Вводится список чисел. Все числа списка находятся на одной строке.

\n", 138 | "
\n", 139 | "
\n", 140 | "
\n", 141 | " Выходные данные\n", 142 | "
\n", 143 | "

Выведите ответ на задачу.

\n", 144 | "
\n", 145 | "
Примеры
Входные данные
1 2 3 4 5\n",
146 |     "
Выходные данные
1 3 5 \n",
147 |     "
" 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "metadata": {}, 153 | "source": [ 154 | "### [Задача D](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3528) (1 балл)\n", 155 | "\n", 156 | "
\n", 157 | "
\n", 158 | "

Даны два целых числа A и B (при этом A≤B). Выведите все числа от A до B включительно.\n", 159 | "\n", 160 | "

\n", 161 | "
\n", 162 | "
\n", 163 | " Входные данные\n", 164 | "
\n", 165 | "

Вводятся два целых числа.

\n", 166 | "
\n", 167 | "
\n", 168 | "
\n", 169 | " Выходные данные\n", 170 | "
\n", 171 | "

Выведите ответ на задачу.

\n", 172 | "
\n", 173 | "
Примеры
Входные данные
1\n",
174 |     "10\n",
175 |     "
Выходные данные
1 2 3 4 5 6 7 8 9 10 \n",
176 |     "
" 177 | ] 178 | }, 179 | { 180 | "cell_type": "markdown", 181 | "metadata": {}, 182 | "source": [ 183 | "### [Задача E](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3539) (2 балла)\n", 184 | "\n", 185 | "
\n", 186 | "
\n", 187 | "

Дано 10 целых чисел. Вычислите их сумму. Напишите программу, использующую наименьшее число переменных.

\n", 188 | "
\n", 189 | "
\n", 190 | "
\n", 191 | " Входные данные\n", 192 | "
\n", 193 | "

Вводятся 10 целых чисел. Каждое число вводится в отдельной строке.

\n", 194 | "
\n", 195 | "
\n", 196 | "
\n", 197 | " Выходные данные\n", 198 | "
\n", 199 | "

Выведите ответ на задачу.

\n", 200 | "
\n", 201 | "
Примеры
Входные данные
0\n",
202 |     "1\n",
203 |     "2\n",
204 |     "3\n",
205 |     "4\n",
206 |     "5\n",
207 |     "6\n",
208 |     "7\n",
209 |     "8\n",
210 |     "9\n",
211 |     "
Выходные данные
45\n",
212 |     "
" 213 | ] 214 | }, 215 | { 216 | "cell_type": "markdown", 217 | "metadata": {}, 218 | "source": [ 219 | "### [Задача F](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3540) (2 балла)\n", 220 | "\n", 221 | "
\n", 222 | "
\n", 223 | "

Дано несколько чисел. Вычислите их сумму. Сначала вводите количество чисел N, затем вводится ровно N целых чисел.\n", 224 | "Какое наименьшее число переменных нужно для решения этой задачи?

\n", 225 | "
\n", 226 | "
\n", 227 | "
\n", 228 | " Входные данные\n", 229 | "
\n", 230 | "

В первой строке вводится натуральное число N - количество чисел. В следующих N строках вводится по одному целому числу.

\n", 231 | "
\n", 232 | "
\n", 233 | "
\n", 234 | " Выходные данные\n", 235 | "
\n", 236 | "

Выведите ответ на задачу.

\n", 237 | "
\n", 238 | "
Примеры
Входные данные
2\n",
239 |     "235\n",
240 |     "56\n",
241 |     "\n",
242 |     "
Выходные данные
291\n",
243 |     "
" 244 | ] 245 | }, 246 | { 247 | "cell_type": "markdown", 248 | "metadata": {}, 249 | "source": [ 250 | "### [Задача G](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3531) (2 балла)\n", 251 | "\n", 252 | "
\n", 253 | "
\n", 254 | "

По данному натуральном $n$ вычислите сумму \n", 255 | "$1^2+2^2+3^2+...+n^2$.\n", 256 | "\n", 257 | "

\n", 258 | "
\n", 259 | "
\n", 260 | " Входные данные\n", 261 | "
\n", 262 | "

Вводится натуральное число.

\n", 263 | "
\n", 264 | "
\n", 265 | "
\n", 266 | " Выходные данные\n", 267 | "
\n", 268 | "

Выведите ответ на задачу.

\n", 269 | "
\n", 270 | "
Примеры
Входные данные
3\n",
271 |     "
Выходные данные
14\n",
272 |     "
" 273 | ] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "metadata": {}, 278 | "source": [ 279 | "### [Задача H](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3447) (2 балла)\n", 280 | "\n", 281 | "
\n", 282 | "
\n", 283 | "

Вот ряд, в котором вычисляется значение дзета-функции для числа 2:\n", 284 | "\n", 285 | "$$\n", 286 | "\\frac{\\pi^2}{6} = \\frac{1}{1^2}+\\frac{1}{2^2}+\\frac{1}{3^2}+\\frac{1}{4^2}+ ...\n", 287 | "$$\n", 288 | "\n", 289 | "

\n", 290 | "

\n", 291 | "Вычислите приближение к числу $\\pi$, используя первые 10 членов этого ряда.\n", 292 | "

\n", 293 | "
\n", 294 | "
" 295 | ] 296 | }, 297 | { 298 | "cell_type": "markdown", 299 | "metadata": {}, 300 | "source": [ 301 | "### [Задача I](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3841) (2 балла)\n", 302 | "\n", 303 | "
\n", 304 | "
\n", 305 | "

Переставьте соседние элементы списка (A[0] c A[1],\n", 306 | "A[2] c A[3] и т.д.).\n", 307 | "Если элементов нечетное число, то последний элемент остается на своем месте.

\n", 308 | "
\n", 309 | "
\n", 310 | "
\n", 311 | " Входные данные\n", 312 | "
\n", 313 | "

Вводится список чисел. Все числа списка находятся на одной строке.

\n", 314 | "
\n", 315 | "
\n", 316 | "
\n", 317 | " Выходные данные\n", 318 | "
\n", 319 | "

Выведите ответ на задачу.

\n", 320 | "
\n", 321 | "
Примеры
Входные данные
1 2 3 4 5\n",
322 |     "
Выходные данные
2 1 4 3 5 \n",
323 |     "
" 324 | ] 325 | }, 326 | { 327 | "cell_type": "markdown", 328 | "metadata": {}, 329 | "source": [ 330 | "### [Задача J](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3551) (3 балла)\n", 331 | "\n", 332 | "
\n", 333 | "
\n", 334 | "

По данному натуральном $n$ вычислите сумму $1!+2!+3!+...+n!$.\n", 335 | "В решении этой задачи можно использовать\n", 336 | "только один цикл и нельзя использовать `import`.

\n", 337 | "
\n", 338 | "
\n", 339 | "
\n", 340 | " Входные данные\n", 341 | "
\n", 342 | "

Вводится натуральное число n.

\n", 343 | "
\n", 344 | "
\n", 345 | "
\n", 346 | " Выходные данные\n", 347 | "
\n", 348 | "

Выведите ответ на задачу.

\n", 349 | "
\n", 350 | "
Примеры
Входные данные
3\n",
351 |     "
Выходные данные
9\n",
352 |     "
" 353 | ] 354 | }, 355 | { 356 | "cell_type": "markdown", 357 | "metadata": {}, 358 | "source": [ 359 | "### [Задача K](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3609) (2 балла)\n", 360 | "\n", 361 | "
\n", 362 | "
\n", 363 | "

Дано положительное действительное число X. Выведите его первую цифру после десятичной точки.\n", 364 | "При решении этой задачи нельзя пользоваться условной инструкцией и циклом.

\n", 365 | "
\n", 366 | "
\n", 367 | "
\n", 368 | " Входные данные\n", 369 | "
\n", 370 | "

Вводится положительное действительное число.

\n", 371 | "
\n", 372 | "
\n", 373 | "
\n", 374 | " Выходные данные\n", 375 | "
\n", 376 | "

Выведите ответ на задачу.

\n", 377 | "
\n", 378 | "
Примеры
Входные данные
1.79\n",
379 |     "
Выходные данные
7\n",
380 |     "
" 381 | ] 382 | }, 383 | { 384 | "cell_type": "markdown", 385 | "metadata": {}, 386 | "source": [ 387 | "### [Задача L](http://informatics.mccme.ru/mod/statements/view3.php?id=16876&chapterid=3535) (4 балла)\n", 388 | "\n", 389 | "
\n", 390 | "
\n", 391 | "

Напишите программу, которая по данному числу n от 1 до 9 выводит на экран n пингвинов. Изображение одного пингвина\n", 392 | "имеет размер 5×9 символов, между двумя соседними пингвинами также имеется пустой (из пробелов) столбец. Разрешается\n", 393 | "вывести пустой столбец после последнего пингвина. Для упрощения рисования скопируйте пингвина из примера в среду\n", 394 | "разработки.\n", 395 | "\n", 396 | "

\n", 397 | "
\n", 398 | "
\n", 399 | " Входные данные\n", 400 | "
\n", 401 | "

Вводится натуральное число.

\n", 402 | "
\n", 403 | "
\n", 404 | "
\n", 405 | " Выходные данные\n", 406 | "
\n", 407 | "

Выведите ответ на задачу.

\n", 408 | "
\n", 409 | "
\n", 410 | "\tПримечание\n", 411 | "
\n", 412 | "

Учтите, что вывод данных на экран производится построчно, а не попингвинно.

\n", 413 | "

В некоторых языках программирования символ обратного слэша “\\” в текстовых строках\n", 414 | "\tимеет специальное значение. Чтобы включить в состав текстовой\n", 415 | "\tстроки такой символ, его нужно повторить дважды. Например,\n", 416 | "\tдля вывода на экран одного такого символа можно использовать\n", 417 | "\tтакой код: print(\"\\\\\").

\n", 418 | "
\n", 419 | "
\n", 420 | "
Примеры
Входные данные
3\n",
421 |     "
Выходные данные
\n", 422 | "
   _~_       _~_       _~_    \n",
423 |     "  (o o)     (o o)     (o o)   \n",
424 |     " /  V  \\   /  V  \\   /  V  \\  \n",
425 |     "/(  _  )\\ /(  _  )\\ /(  _  )\\ \n",
426 |     "  ^^ ^^     ^^ ^^     ^^ ^^   \n",
427 |     "
Входные данные
1\n",
428 |     "
Выходные данные
   _~_    \n",
429 |     "  (o o)   \n",
430 |     " /  V  \\  \n",
431 |     "/(  _  )\\ \n",
432 |     "  ^^ ^^   \n",
433 |     "
" 434 | ] 435 | } 436 | ], 437 | "metadata": { 438 | "kernelspec": { 439 | "display_name": "Python 3", 440 | "language": "python", 441 | "name": "python3" 442 | }, 443 | "language": "python", 444 | "language_info": { 445 | "codemirror_mode": { 446 | "name": "ipython", 447 | "version": 3 448 | }, 449 | "file_extension": ".py", 450 | "mimetype": "text/x-python", 451 | "name": "python", 452 | "nbconvert_exporter": "python", 453 | "pygments_lexer": "ipython3", 454 | "version": "3.4.3" 455 | } 456 | }, 457 | "nbformat": 4, 458 | "nbformat_minor": 0 459 | } 460 | -------------------------------------------------------------------------------- /Problem Set 3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\n", 8 | "# Программирование на языке Python для сбора и анализа данных\n", 9 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 10 | "\n", 11 | "Данный notebook является набором задач по курсу \n", 12 | "«Программирование на языке Python для сбора и анализа данных» \n", 13 | "(НИУ ВШЭ, 2014-15). Тексты задач взяты с сайта http://informatics.mccme.ru/. \n", 14 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## Домашнее задание №3\n", 22 | "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 14 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 14 баллов, чтобы подстраховаться." 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "### [Задача A](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=2959) (1 балл)\n", 30 | "\n", 31 | "
\n", 32 | "
\n", 33 | "

В математике функция sign(x) (знак числа) определена так:
sign(x) = 1,   если x > 0,
sign(x) = -1, если x < 0,
sign(x) = 0,   если x = 0.

Для данного числа x выведите значение sign(x).\n", 34 | "\n", 35 | "
\n", 36 | "
\n", 37 | "
\n", 38 | " Входные данные\n", 39 | "
\n", 40 | "

Вводится число x.

\n", 41 | "
\n", 42 | "
\n", 43 | "
\n", 44 | " Выходные данные\n", 45 | "
\n", 46 | "

Выведите ответ на задачу.

\n", 47 | "
\n", 48 | "
Примеры
Входные данные
179\n",
 49 |     "
Выходные данные
1\n",
 50 |     "
" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": {}, 56 | "source": [ 57 | "### [Задача B](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3504) (1 балл)\n", 58 | "\n", 59 | "
\n", 60 | "
\n", 61 | "

Дано натуральное число. Требуется определить, является ли год с данным номером високосным. Если год является високосным,\n", 62 | "то выведите YES, иначе выведите NO.\n", 63 | "Напомним, что в соответствии с григорианским календарем, год является високосным, если его номер кратен 4, но не кратен 100, а также если он кратен 400.

\n", 64 | "
\n", 65 | "
\n", 66 | "
\n", 67 | " Входные данные\n", 68 | "
\n", 69 | "

Вводится одно натуральное число.

\n", 70 | "
\n", 71 | "
\n", 72 | "
\n", 73 | " Выходные данные\n", 74 | "
\n", 75 | "

Выведите ответ на задачу.

\n", 76 | "
\n", 77 | "
Примеры
Входные данные
100\n",
 78 |     "
Выходные данные
NO\n",
 79 |     "
" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "### [Задача C](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3505) (2 балла)\n", 87 | "\n", 88 | "
\n", 89 | "
\n", 90 | "

Даны три целых числа. Найдите наибольшее из них (программа должна вывести ровно одно целое число).\n", 91 | "\n", 92 | "

\n", 93 | "

Внимание! Здесь запрещено использовать функции `min`, `max` и им подобные.\n", 94 | "\n", 95 | "

Какое наименьшее число операторов сравнения (>, <, >=, <=) необходимо для решения этой задачи?\n", 96 | "\n", 97 | "

\n", 98 | "
\n", 99 | "
\n", 100 | " Входные данные\n", 101 | "
\n", 102 | "

Вводится три целых числа.

\n", 103 | "
\n", 104 | "
\n", 105 | "
\n", 106 | " Выходные данные\n", 107 | "
\n", 108 | "

Выведите ответ на задачу.

\n", 109 | "
\n", 110 | "
Примеры
Входные данные
1\n",
111 |     "2\n",
112 |     "3\n",
113 |     "
Выходные данные
3\n",
114 |     "
" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": {}, 120 | "source": [ 121 | "### [Задача D](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3507) (2 балла)\n", 122 | "\n", 123 | "
\n", 124 | "
\n", 125 | "

Даны три целых числа. Определите, сколько среди них совпадающих. Программа должна вывести одно из чисел: 3 (если все совпадают), 2 (если два совпадает) или 0 (если все числа различны).\n", 126 | "\n", 127 | "

\n", 128 | "

**Внимание**! Здесь запрещено использовать множества (`sets`), словари и прочие продвинутые методы языка. Решение должно быть основано на операторе `if`.

\n", 129 | "
\n", 130 | "
\n", 131 | "
\n", 132 | " Входные данные\n", 133 | "
\n", 134 | "

Вводятся три целых числа.

\n", 135 | "
\n", 136 | "
\n", 137 | "
\n", 138 | " Выходные данные\n", 139 | "
\n", 140 | "

Выведите ответ на задачу.

\n", 141 | "
\n", 142 | "
Примеры
Входные данные
1\n",
143 |     "2\n",
144 |     "3\n",
145 |     "\n",
146 |     "
Выходные данные
0\n",
147 |     "
" 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "metadata": {}, 153 | "source": [ 154 | "### [Задача E](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3512) (3 балла)\n", 155 | "\n", 156 | "
\n", 157 | "
\n", 158 | "

Шахматный ферзь ходит по диагонали, горизонтали или вертикали. Даны две различные клетки шахматной доски, определите,\n", 159 | "может ли ферзь попасть с первой клетки на вторую одним ходом.

\n", 160 | "
\n", 161 | "
\n", 162 | "
\n", 163 | " Входные данные\n", 164 | "
\n", 165 | "

Программа получает на вход четыре числа\n", 166 | "от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки.

\n", 167 | "
\n", 168 | "
\n", 169 | "
\n", 170 | " Выходные данные\n", 171 | "
\n", 172 | "

Программа должна вывести YES, если из первой клетки ходом ферзя можно попасть во вторую или NO в противном случае.

\n", 173 | "
\n", 174 | "
Примеры
Входные данные
1\n",
175 |     "1\n",
176 |     "2\n",
177 |     "2\n",
178 |     "\n",
179 |     "
Выходные данные
YES\n",
180 |     "
Входные данные
1\n",
181 |     "1\n",
182 |     "2\n",
183 |     "3\n",
184 |     "
Выходные данные
NO\n",
185 |     "
" 186 | ] 187 | }, 188 | { 189 | "cell_type": "markdown", 190 | "metadata": {}, 191 | "source": [ 192 | "### [Задача F](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3517) (3 балла)\n", 193 | "\n", 194 | "
\n", 195 | "
\n", 196 | "

Для данного числа n<100 закончите фразу “На лугу пасется...”\n", 197 | "одним из возможных продолжений: “n коров”, “n корова”, “n коровы”,\n", 198 | "правильно склоняя слово “корова”.

\n", 199 | "
\n", 200 | "
\n", 201 | "
\n", 202 | " Входные данные\n", 203 | "
\n", 204 | "

Вводится натуральное число.

\n", 205 | "
\n", 206 | "
\n", 207 | "
\n", 208 | " Выходные данные\n", 209 | "
\n", 210 | "

Программа должна вывести введенное число n и одно из слов: korov, korova\n", 211 | "или korovy. Между числом и словом должен стоять ровно один пробел.

\n", 212 | "
\n", 213 | "
Примеры
Входные данные
1\n",
214 |     "
Выходные данные
1 korova\n",
215 |     "
Входные данные
2\n",
216 |     "
Выходные данные
2 korovy\n",
217 |     "
Входные данные
5\n",
218 |     "
Выходные данные
5 korov\n",
219 |     "
" 220 | ] 221 | }, 222 | { 223 | "cell_type": "markdown", 224 | "metadata": {}, 225 | "source": [ 226 | "### [Задача G](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3619) (2 балла)\n", 227 | "\n", 228 | "
\n", 229 | "
\n", 230 | "

Даны произвольные действительные коэффициенты $a$, $b$, $c$. Решите уравнение\n", 231 | "$ax^2+bx+c=0$.\n", 232 | "\n", 233 | "

\n", 234 | "
\n", 235 | "
\n", 236 | " Входные данные\n", 237 | "
\n", 238 | "

Вводятся три действительных числа.

\n", 239 | "
\n", 240 | "
\n", 241 | "
\n", 242 | " Выходные данные\n", 243 | "
\n", 244 | "

Если данное уравнение не имеет корней, выведите число 0. Если уравнение\n", 245 | "имеет один корень, выведите число 1, а затем этот корень. Если уравнение имеет\n", 246 | "два корня, выведите число 2, а затем два корня в порядке возрастания. Если уравнение\n", 247 | "имеет бесконечно много корней, выведите число 3.

\n", 248 | "
\n", 249 | "
Примеры
Входные данные
1\n",
250 |     "-1\n",
251 |     "-2\n",
252 |     "
Выходные данные
2 -1 2\n",
253 |     "
Входные данные
1\n",
254 |     "2\n",
255 |     "1\n",
256 |     "
Выходные данные
1 -1\n",
257 |     "
" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "### [Задача H](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3642) (1 балл)\n", 265 | "\n", 266 | "
\n", 267 | "
\n", 268 | "

По данному целому числу N распечатайте все квадраты натуральных чисел,\n", 269 | "не превосходящие N, в порядке возрастания.

\n", 270 | "
\n", 271 | "
\n", 272 | "
\n", 273 | " Входные данные\n", 274 | "
\n", 275 | "

Вводится натуральное число.

\n", 276 | "
\n", 277 | "
\n", 278 | "
\n", 279 | " Выходные данные\n", 280 | "
\n", 281 | "

Выведите ответ на задачу.

\n", 282 | "
\n", 283 | "
Примеры
Входные данные
50\n",
284 |     "
Выходные данные
1 4 9 16 25 36 49 \n",
285 |     "
" 286 | ] 287 | }, 288 | { 289 | "cell_type": "markdown", 290 | "metadata": {}, 291 | "source": [ 292 | "### [Задача I](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3643) (1 балл)\n", 293 | "\n", 294 | "
\n", 295 | "
\n", 296 | "

Дано целое число, не меньшее 2. Выведите его наименьший натуральный делитель, отличный от 1.

\n", 297 | "
\n", 298 | "
\n", 299 | "
\n", 300 | " Входные данные\n", 301 | "
\n", 302 | "

Вводится целое положительное число.

\n", 303 | "
\n", 304 | "
\n", 305 | "
\n", 306 | " Выходные данные\n", 307 | "
\n", 308 | "

Выведите ответ на задачу.

\n", 309 | "
\n", 310 | "
Примеры
Входные данные
15\n",
311 |     "
Выходные данные
3\n",
312 |     "
" 313 | ] 314 | }, 315 | { 316 | "cell_type": "markdown", 317 | "metadata": {}, 318 | "source": [ 319 | "### [Задача J](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3648) (2 балла)\n", 320 | "\n", 321 | "
\n", 322 | "
\n", 323 | "

Вклад в банке составляет \\(x\\) рублей. Ежегодно он увеличивается на \\(p\\) процентов,\n", 324 | "после чего дробная часть копеек отбрасывается. Определите, через сколько лет вклад составит не менее \\(y\\) рублей.

\n", 325 | "
\n", 326 | "
\n", 327 | "
\n", 328 | " Входные данные\n", 329 | "
\n", 330 | "

Программа получает на вход три натуральных числа: \\(x\\), \\(p\\), \\(y\\).

\n", 331 | "
\n", 332 | "
\n", 333 | "
\n", 334 | " Выходные данные\n", 335 | "
\n", 336 | "

Программа должна вывести одно целое число.

\n", 337 | "
\n", 338 | "
Примеры
Входные данные
100\n",
339 |     "10\n",
340 |     "200\n",
341 |     "
Выходные данные
8\n",
342 |     "
" 343 | ] 344 | }, 345 | { 346 | "cell_type": "markdown", 347 | "metadata": {}, 348 | "source": [ 349 | "### [Задача K](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3660) (2 балла)\n", 350 | "\n", 351 | "
\n", 352 | "
\n", 353 | "

Последовательность Фибоначчи определяется так:\n", 354 | "\n", 355 | "$$\n", 356 | "\\varphi_0=0, \\varphi_1=1, ..., \\varphi_{n}=\\varphi_{n-1}+\\varphi_{n-2}.\n", 357 | "$$\n", 358 | "

\n", 359 | "

Дано натуральное число $A$. Определите, каким по счету числом Фибоначчи оно является,\n", 360 | "то есть выведите такое число $n$, что \n", 361 | "
\n", 362 | "$$\\varphi_n=A.$$ \n", 363 | "
\n", 364 | "Если $А$ не является числом Фибоначчи,\n", 365 | "выведите число -1.

\n", 366 | "
\n", 367 | "
\n", 368 | "
\n", 369 | " Входные данные\n", 370 | "
\n", 371 | "

Вводится натуральное число A.

\n", 372 | "
\n", 373 | "
\n", 374 | "
\n", 375 | " Выходные данные\n", 376 | "
\n", 377 | "

Выведите ответ на задачу.

\n", 378 | "
\n", 379 | "
Примеры
Входные данные
8\n",
380 |     "
Выходные данные
6\n",
381 |     "
Входные данные
10\n",
382 |     "
Выходные данные
-1\n",
383 |     "
" 384 | ] 385 | }, 386 | { 387 | "cell_type": "markdown", 388 | "metadata": {}, 389 | "source": [ 390 | "### [Задача L](http://informatics.mccme.ru/mod/statements/view3.php?id=17062&chapterid=3667) (5 балла)\n", 391 | "\n", 392 | "
\n", 393 | "
\n", 394 | "

У исполнителя “Водолей” есть два сосуда, первый объемом A литров,\n", 395 | "второй объемом B литров, а также кран с водой. Водолей может выполнять следующие\n", 396 | "операции:

\n", 397 | "
    \n", 398 | "
  1. Наполнить сосуд A (обозначается >A).\n", 399 | "\n", 400 | "
  2. Наполнить сосуд B (обозначается >B).\n", 401 | "
  3. Вылить воду из сосуда A (обозначается A>).\n", 402 | "
  4. Вылить воду из сосуда B (обозначается B>).\n", 403 | "
  5. Перелить воду из сосуда A в сосуд B (обозначается как A>B).\n", 404 | "
  6. Перелить воду из сосуда B в сосуд A (обозначается как B>A).\n", 405 | "\n", 406 | "
\n", 407 | "

Команда переливания из одного сосуда в другой приводят к тому, что либо первый сосуд полностью\n", 408 | "опустошается, либо второй сосуд полность наполняется.

\n", 409 | "
\n", 410 | "
\n", 411 | "
\n", 412 | " Входные данные\n", 413 | "
\n", 414 | "

Программа получает на вход три натуральных числа A, B, N, не превосходящих 104.

\n", 415 | "
\n", 416 | "
\n", 417 | "
\n", 418 | " Выходные данные\n", 419 | "
\n", 420 | "

Необходимо вывести алгоритм действий Водолея, который позволяет получить в точности N литров\n", 421 | "в одном из сосудов, если же такого алгоритма не существует, то программа должна вывести текст Impossible.

\n", 422 | "

Количество операций в алгоритме не должно превышать 105. Гарантируется,\n", 423 | "что если задача имеет решение, то есть решение, которое содержит не более, чем 105 операций.\n", 424 | "\n", 425 | "

Тесты к этой задаче закрытые.

\n", 426 | "
\n", 427 | "
Примеры
Входные данные
3\n",
428 |     "5\n",
429 |     "1\n",
430 |     "
Выходные данные
>A\n",
431 |     "A>B\n",
432 |     ">A\n",
433 |     "A>B\n",
434 |     "
Входные данные
3\n",
435 |     "5\n",
436 |     "6\n",
437 |     "
Выходные данные
Impossible\n",
438 |     "
" 439 | ] 440 | } 441 | ], 442 | "metadata": { 443 | "kernelspec": { 444 | "display_name": "Python 3", 445 | "language": "python", 446 | "name": "python3" 447 | }, 448 | "language": "python", 449 | "language_info": { 450 | "codemirror_mode": { 451 | "name": "ipython", 452 | "version": 3 453 | }, 454 | "file_extension": ".py", 455 | "mimetype": "text/x-python", 456 | "name": "python", 457 | "nbconvert_exporter": "python", 458 | "pygments_lexer": "ipython3", 459 | "version": "3.4.3" 460 | } 461 | }, 462 | "nbformat": 4, 463 | "nbformat_minor": 0 464 | } 465 | -------------------------------------------------------------------------------- /Lecture 9.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "\n", 9 | "*Текст лекции: Щуров И.В., НИУ ВШЭ*\n", 10 | "\n", 11 | "Данный notebook является конспектом лекции по курсу «Программирование на языке Python для сбора и анализа данных» (НИУ ВШЭ, 2015-16). Он распространяется на условиях лицензии [Creative Commons Attribution-Share Alike 4.0](http://creativecommons.org/licenses/by-sa/4.0/). При использовании обязательно упоминание автора курса и аффилиации. При наличии технической возможности необходимо также указать активную гиперссылку на [страницу курса](http://math-info.hse.ru/s15/m). Фрагменты кода, включенные в этот notebook, публикуются как [общественное достояние](http://creativecommons.org/publicdomain/zero/1.0/).\n", 12 | "\n", 13 | "Другие материалы курса, включая конспекты и видеозаписи лекций, а также наборы задач, можно найти на [странице курса](http://math-info.hse.ru/s15/m)." 14 | ] 15 | }, 16 | { 17 | "cell_type": "markdown", 18 | "metadata": {}, 19 | "source": [ 20 | "## Лекция №9: Поиск данных на HTML-страницах и работа с API с помощью XML" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "### Поиск данных на HTML-странице\n", 28 | "На предыдущей лекции мы познакомились с библиотекой *Beautiful Soup* и рассмотрели простейший пример обработки HTML с его помощью. Сейчас мы обсудим более сложные сценарии поиска данных на веб-страницах. Для примера возьмём статью из Википедии о романе М. А. Булгакова [Мастер и Маргарита](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%B8_%D0%9C%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D1%82%D0%B0).\n", 29 | "\n", 30 | "Заметим, что в Википедии встречаются ссылки двух типов: внутренние (на другие страницы Википедии) и внешние (на другие сайты), причём они различаются по оформлению — у внешних ссылок есть небольшая стрелочка. Например, мы хотим выбрать все внешние ссылки. Как это сделать?\n", 31 | "\n", 32 | "Для того, чтобы браузер отображал внешние ссылки не так, как внутренние, разработчики Википедии используют так называемые css-классы (конечно, это касается не только Википедии — это вообще основной инструмент современного веба). Теги `
`, соответствующие внешним ссылкам, имеют специальный атрибут `class`, значение которого включает слово `external`. Именно по нему можно понять, что речь идёт о внешней ссылке. Это можно было бы увидеть, изучив исходный код страницы, но мы сделаем проще: воспользуемся встроенным инспектором кода в Firefox (в других браузерах есть аналоги — встроенные или в виде расширений)." 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "![Тег `` с классом `external`](http://math-info.hse.ru/f/2015-16/all-py/m_and_m_1.png)" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "На скриншоте видно, что в исходном коде в атрибуте `class` тега `` указана строчка `\"external text\"`, а не просто `\"external\"` — дело в том, что теги могут иметь сразу несколько классов одновременно, и в данном случае `external` и `text` — это два класса данной ссылки. Но мы будем ориентироваться только на `external`.\n", 47 | "\n", 48 | "Итак, мы хотим найти все ссылки с классом `external`. Это очень просто." 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 1, 54 | "metadata": { 55 | "collapsed": true 56 | }, 57 | "outputs": [], 58 | "source": [ 59 | "from bs4 import BeautifulSoup\n", 60 | "import requests" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 8, 66 | "metadata": { 67 | "collapsed": true 68 | }, 69 | "outputs": [], 70 | "source": [ 71 | "url = \"https://ru.wikipedia.org/w/index.php?oldid=75475510\"\n", 72 | "# Используем постоянную ссылку для воспроизводимости результатов" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 3, 78 | "metadata": { 79 | "collapsed": true 80 | }, 81 | "outputs": [], 82 | "source": [ 83 | "g = requests.get(url)" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": 4, 89 | "metadata": { 90 | "collapsed": false 91 | }, 92 | "outputs": [ 93 | { 94 | "data": { 95 | "text/plain": [ 96 | "True" 97 | ] 98 | }, 99 | "execution_count": 4, 100 | "metadata": {}, 101 | "output_type": "execute_result" 102 | } 103 | ], 104 | "source": [ 105 | "g.ok" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 6, 111 | "metadata": { 112 | "collapsed": false 113 | }, 114 | "outputs": [], 115 | "source": [ 116 | "page = BeautifulSoup(g.text, \"html.parser\")" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 7, 122 | "metadata": { 123 | "collapsed": false 124 | }, 125 | "outputs": [ 126 | { 127 | "name": "stdout", 128 | "output_type": "stream", 129 | "text": [ 130 | "//ru.wikipedia.org/w/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%96%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D1%8B&type=review&page=%D0%9C%D0%B0%D1%81%D1%82%D0%B5%D1%80_%D0%B8_%D0%9C%D0%B0%D1%80%D0%B3%D0%B0%D1%80%D0%B8%D1%82%D0%B0\n", 131 | "http://dombulgakova.ru/bulgakovskaya-biblioteka-2/lidiya-yanovskaya-o-romane-bulgakova-mas/\n", 132 | "http://magazines.russ.ru/zvezda/2000/6/suhih.html\n", 133 | "http://magazines.russ.ru/sib/2013/6/10d.html\n", 134 | "http://mirknig.mobi/data/2012-12-06/1291088/Chudakova_Vremya_chitat_3_Ne_dlya_vzroslyih._Vremya_chitat_Polka_tretya.1291088.pdf\n", 135 | "http://www.e-reading.club/chapter.php/39079/24/Zerkalov_-_Etika_Mihaila_Bulgakova.html\n", 136 | "http://www.litmir.co/br/?b=65955&p=163\n", 137 | "http://www.bulgakov.ru/m/morphiy/\n", 138 | "http://www.russofile.ru/articles/article_67.php\n", 139 | "http://feb-web.ru/feb/mayakovsky/texts/ms0/ms9/ms9-183-.htm\n", 140 | "http://magazines.russ.ru/slovo/2008/58/ko11.html\n", 141 | "http://magazines.russ.ru/nlo/2005/76/bra.html\n", 142 | "http://www.rg.ru/2005/12/16/master.html\n", 143 | "http://magazines.russ.ru/voplit/2009/4/ga8.html\n", 144 | "http://magazines.russ.ru/znamia/2011/10/bo30.html\n", 145 | "http://kinoart.ru/archive/2006/01/n1-article4\n", 146 | "http://magazines.russ.ru/znamia/2007/1/bu17.html\n", 147 | "http://izvestia.ru/news/499828\n", 148 | "http://www.rg.ru/2011/09/08/mht.html\n", 149 | "https://musicbrainz.org/work/2fa8ecec-2103-4aa7-97f1-2fbfd1c0607d\n", 150 | "http://catalogue.bnf.fr/ark:/12148/cb11941979p\n", 151 | "http://www.idref.fr/027361241\n", 152 | "http://viaf.org/viaf/175580487\n" 153 | ] 154 | } 155 | ], 156 | "source": [ 157 | "for link in page.findAll(\"a\", class_='external'):\n", 158 | " print(link['href'])" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "Как видно из примера выше, достаточно методу `findAll()` передать дополнительный именованный параметр `class_` — обратите внимание на нижнее подчёркивание, без него получится синтаксическая ошибка, потому что слово `class` имеет специальный смысл в Python.\n", 166 | "\n", 167 | "### Классы и поиск по дереву\n", 168 | "Решим теперь другую задачу: допустим, мы хотим найти все ссылки в разделе «Примечания», где находятся сноски к основному тексту. С помощью инспектора кода мы легко можем заметить, что весь этот раздел находится внутри тега `
` (этот тег описывает прямоугольные блоки, из которых состоят веб-страницы, и является основным тегом для современной веб-вёрстки), имеющем класс `references-small`." 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 13, 174 | "metadata": { 175 | "collapsed": false 176 | }, 177 | "outputs": [], 178 | "source": [ 179 | "divs = page.findAll('div', class_='references-small')" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 14, 185 | "metadata": { 186 | "collapsed": false 187 | }, 188 | "outputs": [ 189 | { 190 | "data": { 191 | "text/plain": [ 192 | "1" 193 | ] 194 | }, 195 | "execution_count": 14, 196 | "metadata": {}, 197 | "output_type": "execute_result" 198 | } 199 | ], 200 | "source": [ 201 | "len(divs)" 202 | ] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "metadata": {}, 207 | "source": [ 208 | "Такой `
` оказался единственным на странице. Вот и хорошо. Найдём теперь все теги ``, являющиеся потомками (возможно, отдалёнными) этого `
`'а." 209 | ] 210 | }, 211 | { 212 | "cell_type": "code", 213 | "execution_count": 15, 214 | "metadata": { 215 | "collapsed": false 216 | }, 217 | "outputs": [ 218 | { 219 | "name": "stdout", 220 | "output_type": "stream", 221 | "text": [ 222 | "#cite_ref-.D0.9B.D0.B5.D1.81.D1.81.D0.BA.D0.B8.D1.81.E2.80.941999.E2.80.94.E2.80.94213_1-0\n", 223 | "#CITEREF.D0.9B.D0.B5.D1.81.D1.81.D0.BA.D0.B8.D1.811999\n", 224 | "#cite_ref-.D0.9B.D0.BE.D1.81.D0.B5.D0.B2.E2.80.941993.E2.80.94.E2.80.94407_2-0\n", 225 | "#cite_ref-.D0.9B.D0.BE.D1.81.D0.B5.D0.B2.E2.80.941993.E2.80.94.E2.80.94407_2-1\n", 226 | "#CITEREF.D0.9B.D0.BE.D1.81.D0.B5.D0.B21993\n", 227 | "#cite_ref-.D0.9B.D0.B5.D1.81.D1.81.D0.BA.D0.B8.D1.81.E2.80.941999.E2.80.94.E2.80.94214_3-0\n", 228 | "#CITEREF.D0.9B.D0.B5.D1.81.D1.81.D0.BA.D0.B8.D1.811999\n", 229 | "#cite_ref-.D0.A7.D1.83.D0.B4.D0.B0.D0.BA.D0.BE.D0.B2.D0.B0.E2.80.941988.E2.80.94.E2.80.94300_4-0\n", 230 | "#CITEREF.D0.A7.D1.83.D0.B4.D0.B0.D0.BA.D0.BE.D0.B2.D0.B01988\n", 231 | "#cite_ref-.D0.A7.D1.83.D0.B4.D0.B0.D0.BA.D0.BE.D0.B2.D0.B0.E2.80.941988.E2.80.94.E2.80.94301_5-0\n" 232 | ] 233 | } 234 | ], 235 | "source": [ 236 | "div = page.findAll('div', class_='references-small')[0]\n", 237 | "for link in div(\"a\")[0:10]:\n", 238 | " print(link['href'])" 239 | ] 240 | }, 241 | { 242 | "cell_type": "markdown", 243 | "metadata": {}, 244 | "source": [ 245 | "Для экономии места я вывел только первые 10 ссылок. Это внутренние ссылки на другие фрагменты страницы, поэтому они начинаются с символа `#`. Легко увидеть, что мы получили то, что требовалось.\n", 246 | "\n", 247 | "### Некоторые итоги\n", 248 | "Подведём некоторые итоги по поводу поиска информации в HTML-файлах:\n", 249 | "\n", 250 | "- Это всегда творческий процесс: все сайты разные и нет единого рецепта, как извлекать из них нужную информацию.\n", 251 | "- В первую очередь нужно посмотреть в исходник интересующей вас странички. Проще всего это делать с помощью инструментария веб-разработчика типа Firebug или встроенного инспектора кода в Firefox или аналогичных инструментов для других браузеров.\n", 252 | "- В HTML-дереве можно ориентироваться по названиям тегов, их классам, id'ам и другим свойствам.\n", 253 | "- Можно искать нужный элемент итеративно — сначала найти «большой» тег, который включает наш элемент, потом найти в нём элемент поменьше и т.д." 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "### API и XML\n", 261 | "Анализируя веб-страницы и извлекая из них информацию мы пытаемся написать программу, которая бы действовала как человек. Это бывает непросто. К счастью, всё чаще разнообразные сайты предлагают информацию, которую может легко обрабатывать не только человек, но и другая программа. Это называется API — application program interface. Обычный интерфейс — это способ взаимодействия человека с программой, а API — одной программы с другой. Например, вашего скрипта на Python с удалённым веб-сервером.\n", 262 | "\n", 263 | "Для хранения веб-страниц, которые читают люди, используется язык HTML. Для хранения произвольных структурированных данных, которыми обмениваются между собой программы, используются другие языки — в частности, язык XML, похожий на HTML. Вернее было бы сказать, что XML это *метаязык*, то есть способ описания языков. В отличие от HTML, набор тегов в XML-документе может быть произвольным (и определяется разработчиком конкретного диалекта XML). Например, если бы мы хотели описать в виде XML некоторую студенческую группу, это могло бы выглядеть так:" 264 | ] 265 | }, 266 | { 267 | "cell_type": "markdown", 268 | "metadata": {}, 269 | "source": [ 270 | "```xml\n", 271 | "\n", 272 | " 134\n", 273 | " \n", 274 | " Виталий\n", 275 | " Иванов\n", 276 | " \n", 277 | " \n", 278 | " Мария\n", 279 | " Петрова\n", 280 | " \n", 281 | "\n", 282 | "```" 283 | ] 284 | }, 285 | { 286 | "cell_type": "markdown", 287 | "metadata": {}, 288 | "source": [ 289 | "Для обработки XML-файлов можно использовать тот же пакет *Beautiful Soup*, который мы уже использовали для работы с HTML. Единственное различие — нужно указать дополнительный параметр `feautres=\"xml\"` при вызове функции `BeautifulSoup` — чтобы он не искал в документе HTML-теги." 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 17, 295 | "metadata": { 296 | "collapsed": true 297 | }, 298 | "outputs": [], 299 | "source": [ 300 | "group = \"\"\"\n", 301 | "134\n", 302 | "\n", 303 | "Виталий\n", 304 | "Иванов\n", 305 | "\n", 306 | "\n", 307 | "Мария\n", 308 | "Петрова\n", 309 | "\n", 310 | "\"\"\"" 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": 20, 316 | "metadata": { 317 | "collapsed": false 318 | }, 319 | "outputs": [ 320 | { 321 | "name": "stdout", 322 | "output_type": "stream", 323 | "text": [ 324 | "\n", 325 | "\n", 326 | " \n", 327 | " 134\n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " Виталий\n", 332 | " \n", 333 | " \n", 334 | " Иванов\n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " Мария\n", 340 | " \n", 341 | " \n", 342 | " Петрова\n", 343 | " \n", 344 | " \n", 345 | "\n" 346 | ] 347 | } 348 | ], 349 | "source": [ 350 | "obj = BeautifulSoup(group, features=\"xml\")\n", 351 | "print(obj.prettify())" 352 | ] 353 | }, 354 | { 355 | "cell_type": "markdown", 356 | "metadata": {}, 357 | "source": [ 358 | "Вот так мы можем найти в нашем XML-документе номер группы:" 359 | ] 360 | }, 361 | { 362 | "cell_type": "code", 363 | "execution_count": 21, 364 | "metadata": { 365 | "collapsed": false 366 | }, 367 | "outputs": [ 368 | { 369 | "data": { 370 | "text/plain": [ 371 | "'134'" 372 | ] 373 | }, 374 | "execution_count": 21, 375 | "metadata": {}, 376 | "output_type": "execute_result" 377 | } 378 | ], 379 | "source": [ 380 | "obj.group.number.string" 381 | ] 382 | }, 383 | { 384 | "cell_type": "markdown", 385 | "metadata": {}, 386 | "source": [ 387 | "Это значит «в объекте `obj` найти тег `group` в нём найти тег `number` и выдать в виде строки то, что в нём содержится.\n", 388 | "\n", 389 | "А вот так можно перечислить всех студентов:" 390 | ] 391 | }, 392 | { 393 | "cell_type": "code", 394 | "execution_count": 30, 395 | "metadata": { 396 | "collapsed": false 397 | }, 398 | "outputs": [ 399 | { 400 | "name": "stdout", 401 | "output_type": "stream", 402 | "text": [ 403 | "Иванов Виталий\n", 404 | "Петрова Мария\n" 405 | ] 406 | } 407 | ], 408 | "source": [ 409 | "for student in obj.group.findAll('student'):\n", 410 | " print(student.lastname.string, student.firstname.string)" 411 | ] 412 | }, 413 | { 414 | "cell_type": "markdown", 415 | "metadata": {}, 416 | "source": [ 417 | "### Получаем список статей из категории в Википедии" 418 | ] 419 | }, 420 | { 421 | "cell_type": "markdown", 422 | "metadata": {}, 423 | "source": [ 424 | "Допустим, нам потребовалось получить список всех статей из некоторой категории в Википедии. Мы могли бы открыть эту категорию в браузере и дальше действовать теми методами, которые обсуждались выше. Однако, на наше счастье разработчики Википедии сделали удобное API. Чтобы научиться с ним работать, придётся познакомиться с [документацией](https://www.mediawiki.org/wiki/API:Main_page) (так будет с любым API), но это кажется сложным только в первый раз. Ну хорошо, в первые 10 раз. Или 20. Потом будет проще.\n", 425 | "\n", 426 | "Итак, приступим. Взаимодействие с сервером при помощи API происходит с помощью отправки специальным образом сформированных запросов и получения ответа в одном из машинночитаемых форматов. Нас будет интересовать формат XML, хотя бывают и другие (позже мы познакомимся с JSONN). А вот такой запрос мы можем отправить:" 427 | ] 428 | }, 429 | { 430 | "cell_type": "markdown", 431 | "metadata": {}, 432 | "source": [ 433 | "https://en.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Physics&cmsort=timestamp&cmdir=desc&format=xmlfm" 434 | ] 435 | }, 436 | { 437 | "cell_type": "markdown", 438 | "metadata": {}, 439 | "source": [ 440 | "Строка `https://en.wikipedia.org/w/api.php` (до знака вопроса) — это *точка входа* в API. Всё, что идёт после знака вопроса — это, собственно, запрос. Он представляет собой что-то вроде словаря и состоит из пар «ключ=значение», разделяемых амперсандом `&`. Некоторые символы приходится кодировать специальным образом.\n", 441 | "\n", 442 | "Например, в адресе выше сказано, что мы хотим сделать запрос (`action=query`), перечислить элементы категории `list=categorymembers`, в качестве категории, которая нас интересует, указана `Category:Physics` (`cmtitle=Category:Physics`) и указаны некоторые другие параметры. Если кликнуть по этой ссылке, откроется примерно такая штука:" 443 | ] 444 | }, 445 | { 446 | "cell_type": "markdown", 447 | "metadata": {}, 448 | "source": [ 449 | "```xml\n", 450 | "\n", 451 | "\n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | "\n", 468 | "```" 469 | ] 470 | }, 471 | { 472 | "cell_type": "markdown", 473 | "metadata": {}, 474 | "source": [ 475 | "Мы видим здесь разные теги, и видим, что нас интересуют теги ``, находящиеся внутри тега ``.\n", 476 | "\n", 477 | "Давайте сделаем соответствующий запрос с помощью Python. Для этого нам понадобится уже знакомый модуль `requests`." 478 | ] 479 | }, 480 | { 481 | "cell_type": "code", 482 | "execution_count": 23, 483 | "metadata": { 484 | "collapsed": true 485 | }, 486 | "outputs": [], 487 | "source": [ 488 | "url = \"https://en.wikipedia.org/w/api.php\"\n", 489 | "params = {\n", 490 | " 'action':'query',\n", 491 | " 'list':'categorymembers',\n", 492 | " 'cmtitle': 'Category:Physics',\n", 493 | " 'format': 'xml'\n", 494 | "}\n", 495 | "\n", 496 | "g = requests.get(url, params=params)" 497 | ] 498 | }, 499 | { 500 | "cell_type": "markdown", 501 | "metadata": {}, 502 | "source": [ 503 | "Как видно, список параметров мы передаем в виде обычного словаря. Посмотрим, что получилось." 504 | ] 505 | }, 506 | { 507 | "cell_type": "code", 508 | "execution_count": 24, 509 | "metadata": { 510 | "collapsed": false 511 | }, 512 | "outputs": [ 513 | { 514 | "data": { 515 | "text/plain": [ 516 | "True" 517 | ] 518 | }, 519 | "execution_count": 24, 520 | "metadata": {}, 521 | "output_type": "execute_result" 522 | } 523 | ], 524 | "source": [ 525 | "g.ok" 526 | ] 527 | }, 528 | { 529 | "cell_type": "markdown", 530 | "metadata": {}, 531 | "source": [ 532 | "Всё хорошо. Теперь используем *Beautiful Soup* для обработки этого XML." 533 | ] 534 | }, 535 | { 536 | "cell_type": "code", 537 | "execution_count": 25, 538 | "metadata": { 539 | "collapsed": false 540 | }, 541 | "outputs": [], 542 | "source": [ 543 | "data = BeautifulSoup(g.text, features='xml')" 544 | ] 545 | }, 546 | { 547 | "cell_type": "code", 548 | "execution_count": 26, 549 | "metadata": { 550 | "collapsed": false 551 | }, 552 | "outputs": [ 553 | { 554 | "name": "stdout", 555 | "output_type": "stream", 556 | "text": [ 557 | "\n", 558 | "\n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | "\n" 575 | ] 576 | } 577 | ], 578 | "source": [ 579 | "print(data.prettify())" 580 | ] 581 | }, 582 | { 583 | "cell_type": "markdown", 584 | "metadata": {}, 585 | "source": [ 586 | "Найдём все вхождения тега `` и выведем их атрибут `title`:" 587 | ] 588 | }, 589 | { 590 | "cell_type": "code", 591 | "execution_count": 27, 592 | "metadata": { 593 | "collapsed": false 594 | }, 595 | "outputs": [ 596 | { 597 | "name": "stdout", 598 | "output_type": "stream", 599 | "text": [ 600 | "Physics\n", 601 | "Branches of physics\n", 602 | "Glossary of classical physics\n", 603 | "Outline of physics\n", 604 | "Portal:Physics\n", 605 | "Classical physics\n", 606 | "Epicatalysis\n", 607 | "Experimental physics\n", 608 | "Hume Feldman\n", 609 | "Microphysics\n" 610 | ] 611 | } 612 | ], 613 | "source": [ 614 | "for cm in data.api.query.categorymembers(\"cm\"):\n", 615 | " print(cm['title'])" 616 | ] 617 | }, 618 | { 619 | "cell_type": "markdown", 620 | "metadata": {}, 621 | "source": [ 622 | "Можно было упростить поиск ``, не указывая «полный путь» к ним:" 623 | ] 624 | }, 625 | { 626 | "cell_type": "code", 627 | "execution_count": 28, 628 | "metadata": { 629 | "collapsed": false 630 | }, 631 | "outputs": [ 632 | { 633 | "name": "stdout", 634 | "output_type": "stream", 635 | "text": [ 636 | "Physics\n", 637 | "Branches of physics\n", 638 | "Glossary of classical physics\n", 639 | "Outline of physics\n", 640 | "Portal:Physics\n", 641 | "Classical physics\n", 642 | "Epicatalysis\n", 643 | "Experimental physics\n", 644 | "Hume Feldman\n", 645 | "Microphysics\n" 646 | ] 647 | } 648 | ], 649 | "source": [ 650 | "for cm in data(\"cm\"):\n", 651 | " print(cm['title'])" 652 | ] 653 | }, 654 | { 655 | "cell_type": "markdown", 656 | "metadata": {}, 657 | "source": [ 658 | "По умолчанию сервер вернул нам список из 10 элементов. Если мы хотим больше, нужно воспользоваться элементом `continue` — это своего рода гиперссылка на следующие 10 элементов." 659 | ] 660 | }, 661 | { 662 | "cell_type": "code", 663 | "execution_count": 29, 664 | "metadata": { 665 | "collapsed": false 666 | }, 667 | "outputs": [ 668 | { 669 | "data": { 670 | "text/plain": [ 671 | "'page|4d4f4445524e20504859534943530a4d4f4445524e2050485953494353|844186'" 672 | ] 673 | }, 674 | "execution_count": 29, 675 | "metadata": {}, 676 | "output_type": "execute_result" 677 | } 678 | ], 679 | "source": [ 680 | "data.find(\"continue\")['cmcontinue']" 681 | ] 682 | }, 683 | { 684 | "cell_type": "markdown", 685 | "metadata": {}, 686 | "source": [ 687 | "Мне пришлось использовать метод `find()` вместо того, чтобы просто написать `data.continue`, потому что `continue` в Python имеет специальный смысл.\n", 688 | "\n", 689 | "Теперь добавим `cmcontinue` в наш запрос и выполним его ещё раз:" 690 | ] 691 | }, 692 | { 693 | "cell_type": "code", 694 | "execution_count": 30, 695 | "metadata": { 696 | "collapsed": true 697 | }, 698 | "outputs": [], 699 | "source": [ 700 | "params['cmcontinue'] = data.api(\"continue\")[0]['cmcontinue']" 701 | ] 702 | }, 703 | { 704 | "cell_type": "code", 705 | "execution_count": 31, 706 | "metadata": { 707 | "collapsed": false 708 | }, 709 | "outputs": [ 710 | { 711 | "name": "stdout", 712 | "output_type": "stream", 713 | "text": [ 714 | "Modern physics\n", 715 | "Northwest Nuclear Consortium\n", 716 | "Phase Stretch Transform\n", 717 | "Statistical mechanics\n", 718 | "Surface science\n", 719 | "Wigner rotation\n", 720 | "Category:Concepts in physics\n", 721 | "Category:Physicists\n", 722 | "Category:Applied and interdisciplinary physics\n", 723 | "Category:Atomic, molecular, and optical physics\n" 724 | ] 725 | } 726 | ], 727 | "source": [ 728 | "g = requests.get(url, params=params)\n", 729 | "data = BeautifulSoup(g.text, features='xml')\n", 730 | "for cm in data.api.query.categorymembers(\"cm\"):\n", 731 | " print(cm['title'])" 732 | ] 733 | }, 734 | { 735 | "cell_type": "markdown", 736 | "metadata": {}, 737 | "source": [ 738 | "Мы получили следующие 10 элементов из категории. Продолжая таким образом, можно выкачать её даже целиком (правда, для этого потребуется много времени).\n", 739 | "\n", 740 | "Аналогичным образом реализована работа с разнообразными другими API, имеющимися на разных сайтах. Где-то API является полностью открытым (как в Википедии), где-то вам потребуется зарегистрироваться и получить application id и какой-нибудь ключ для доступа к API, где-то попросят даже заплатить (например, автоматический поиск в Google стоит что-то вроде 5 долларов за 100 запросов). Есть API, которые позволяют только читать информацию, а бывают и такие, которые позволяют её править. Например, можно написать скрипт, который будет автоматически сохранять какую-то информацию в Google Spreadsheets. Всякий раз при использовании API вам придётся изучить его документацию, но это в любом случае проще, чем обрабатывать HTML-код. Иногда удаётся упростить доступ к API, используя специальные библиотеки." 741 | ] 742 | } 743 | ], 744 | "metadata": { 745 | "kernelspec": { 746 | "display_name": "Python 3", 747 | "language": "python", 748 | "name": "python3" 749 | }, 750 | "language_info": { 751 | "codemirror_mode": { 752 | "name": "ipython", 753 | "version": 3 754 | }, 755 | "file_extension": ".py", 756 | "mimetype": "text/x-python", 757 | "name": "python", 758 | "nbconvert_exporter": "python", 759 | "pygments_lexer": "ipython3", 760 | "version": "3.5.0" 761 | } 762 | }, 763 | "nbformat": 4, 764 | "nbformat_minor": 0 765 | } 766 | -------------------------------------------------------------------------------- /Problem Set 5.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Программирование на языке Python для сбора и анализа данных\n", 8 | "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", 9 | "\n", 10 | "Данный notebook является набором задач по курсу \n", 11 | "«Программирование на языке Python для сбора и анализа данных» \n", 12 | "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", 13 | "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru) (кроме \n", 14 | "задач, про которые сказано обратное) \n", 15 | "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## Домашнее задание №5\n", 23 | "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 12 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 12 баллов, чтобы подстраховаться.\n", 24 | "\n", 25 | "Для предварительной проверки задания нужно скачать данный `ipynb`-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. [здесь](http://math-info.hse.ru/2015-16/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%B0_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85#.D0.9A.D0.B0.D0.BA_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D1.8C)) и вставить решение каждой задачи в ячейку для кода, следующую за его условием (вместо комментария `# YOUR CODE HERE`), запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и задачу нужно решить заново.\n", 26 | "\n", 27 | "**Внимание!** Нельзя создавать новые ячейки или как-либо менять notebook, кроме вставки решений!\n", 28 | "\n", 29 | "Чтобы сдать ДЗ, его надо будет загрузить на сервер в виде `ipynb`-файла. Куда загрузить — мы скажем дополнительно чуть позже." 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": {}, 35 | "source": [ 36 | "### Задача A. (1 балл.)\n", 37 | "Написать функцию `Dan_5(grades)`, принимающую на вход словарь `grades`, добавляющую в него запись с ключом `\"Dan\"` и значением `5` и возвращающую этот словарь." 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 11, 43 | "metadata": { 44 | "collapsed": true, 45 | "deletable": false, 46 | "nbgrader": { 47 | "checksum": "efa9c8f6ffa98b9a694b19866bf4618c", 48 | "grade": false, 49 | "grade_id": "prA", 50 | "locked": false, 51 | "solution": true 52 | } 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "# YOUR CODE HERE" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": null, 62 | "metadata": { 63 | "collapsed": false, 64 | "deletable": false, 65 | "nbgrader": { 66 | "checksum": "f6498eb41f772583f200e01b861525dc", 67 | "grade": true, 68 | "grade_id": "prA_t", 69 | "locked": true, 70 | "points": 1, 71 | "solution": false 72 | } 73 | }, 74 | "outputs": [], 75 | "source": [ 76 | "assert Dan_5({})=={'Dan':5}\n", 77 | "assert Dan_5({'Dan':3})=={'Dan':5}\n", 78 | "assert Dan_5({'Alice':2})['Dan']==5\n", 79 | "assert Dan_5({1:2,3:4,'Dan':'Dan',5:'Dan'})['Dan']==5" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "### Задача B. (1 балл.)\n", 87 | "Написать функцию `Dan_plus_1(grades)`, которая принимает на вход словарь `grades`, после чего меняет его следующим образом. Если в этом словаре имеется запись с ключом `\"Dan\"`, то её значение должно быть увеличено на 1. Если такой записи нет, она должна быть создана и ей должно быть присвоено значение 1. Функция должна вернуть получающийся словарь. Гаранируется, что в словаре `grades` все ключи являются строками, а все значения — целыми числами (проверять это не нужно)." 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": 10, 93 | "metadata": { 94 | "collapsed": true, 95 | "deletable": false, 96 | "nbgrader": { 97 | "checksum": "198a2be0a9cfbc88e194c0a29e747c93", 98 | "grade": false, 99 | "grade_id": "prB", 100 | "locked": false, 101 | "solution": true 102 | } 103 | }, 104 | "outputs": [], 105 | "source": [ 106 | "# YOUR CODE HERE" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": null, 112 | "metadata": { 113 | "collapsed": false, 114 | "deletable": false, 115 | "nbgrader": { 116 | "checksum": "bbdf8989939d4c4b2b3b5ba5870e31dd", 117 | "grade": true, 118 | "grade_id": "prB_t", 119 | "locked": true, 120 | "points": 1, 121 | "solution": false 122 | } 123 | }, 124 | "outputs": [], 125 | "source": [ 126 | "assert Dan_plus_1({})=={'Dan':1}\n", 127 | "assert Dan_plus_1({'Dan':3})=={'Dan':4}\n", 128 | "assert Dan_plus_1({'Alice':4})=={'Alice':4,'Dan':1}\n", 129 | "assert Dan_plus_1({'Alice':4, 'Bob':3, 'Dan':5})=={'Alice':4, 'Bob':3, 'Dan':6}" 130 | ] 131 | }, 132 | { 133 | "cell_type": "markdown", 134 | "metadata": {}, 135 | "source": [ 136 | "### Задача C. (1 балл.)\n", 137 | "Написать функцию `are_there_more_4(grades)`, проверяющую, есть ли среди *значений* словаря `grades` хоть одно число больше 4. Функция должна возвращать `True`, если такое значение есть, и `False` в противном случае. Гарантируется, что значениями словаря являются только числа." 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 9, 143 | "metadata": { 144 | "collapsed": true, 145 | "deletable": false, 146 | "nbgrader": { 147 | "checksum": "d5873d6b88bb361cc3007322819f8bfe", 148 | "grade": false, 149 | "grade_id": "prC", 150 | "locked": false, 151 | "solution": true 152 | } 153 | }, 154 | "outputs": [], 155 | "source": [ 156 | "# YOUR CODE HERE" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": null, 162 | "metadata": { 163 | "collapsed": false, 164 | "deletable": false, 165 | "nbgrader": { 166 | "checksum": "0bf7f9b204a83989c7e0626de514cafe", 167 | "grade": true, 168 | "grade_id": "prC_t", 169 | "locked": true, 170 | "points": 1, 171 | "solution": false 172 | } 173 | }, 174 | "outputs": [], 175 | "source": [ 176 | "assert are_there_more_4({1:2,3:3})==False\n", 177 | "assert are_there_more_4({5:3, 2:3, 4:1})==False\n", 178 | "assert are_there_more_4({6:5})==True\n", 179 | "assert are_there_more_4({})==False\n", 180 | "assert are_there_more_4({'Alice':3, 'Bob':4})==False\n", 181 | "assert are_there_more_4({'Alice':4, 'Bob':5, \"Dan\":3})==True\n", 182 | "assert are_there_more_4({6:8})==True\n", 183 | "assert are_there_more_4({'Alice':4, 'Bob':9, \"Dan\":3})==True" 184 | ] 185 | }, 186 | { 187 | "cell_type": "markdown", 188 | "metadata": {}, 189 | "source": [ 190 | "### Задача D. (1 балл.)\n", 191 | "Написать функцию `append_sum(str_floats)` принимающую на вход список `str_floats`, состоящий из строк, в которых записаны некоторые вещественные числа (с плавающей запятой), и создающую новый список со следующими свойствами: \n", 192 | "\n", 193 | "1. Все элементы нового списка получаются из элементов старого преобразованием к типу «число с плавающей точкой». \n", 194 | "2. В конец списка добавляется ещё один элемент, равный сумме всех других элементов.\n", 195 | "\n", 196 | "После этого новый список возвращается функцией.\n", 197 | "\n", 198 | "Пример: для списка `[\"0.125\",\"0.5\"]` должен быть возвращён список `[0.125, 0.5, 0.625]`." 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": 8, 204 | "metadata": { 205 | "collapsed": true, 206 | "deletable": false, 207 | "nbgrader": { 208 | "checksum": "8a0e44d11c8e69891dba0826117ce758", 209 | "grade": false, 210 | "grade_id": "prD", 211 | "locked": false, 212 | "solution": true 213 | } 214 | }, 215 | "outputs": [], 216 | "source": [ 217 | "# YOUR CODE HERE" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": null, 223 | "metadata": { 224 | "collapsed": true, 225 | "deletable": false, 226 | "nbgrader": { 227 | "checksum": "4365724916b277c44f0e00bf72f6194d", 228 | "grade": true, 229 | "grade_id": "prD_t", 230 | "locked": true, 231 | "points": 1, 232 | "solution": false 233 | } 234 | }, 235 | "outputs": [], 236 | "source": [ 237 | "def assert_eq(x,y):\n", 238 | " for _x, _y in zip(x,y):\n", 239 | " assert(abs(_x-_y)<1E-15)\n", 240 | "assert_eq(append_sum([\"0.125\",\"0.5\"]),[0.125, 0.5, 0.625])\n", 241 | "assert_eq(append_sum([\"0\"]),[0,0])\n", 242 | "assert_eq(append_sum([\"1\",\"-2\"]),[1,-2,-1])\n", 243 | "assert_eq(append_sum([\"0.1234567\",\"0.111111\",\"0.1231241243\", \"12.12312314\"]), \n", 244 | " [0.1234567, 0.111111, 0.1231241243, 12.12312314, 12.4808149643])\n", 245 | "del assert_eq" 246 | ] 247 | }, 248 | { 249 | "cell_type": "markdown", 250 | "metadata": {}, 251 | "source": [ 252 | "### Задача E. (1 балл.)\n", 253 | "Написать функцию `flatten_dict(d)`, принимающую на вход словарь `d` и возвращающую список, в который записаны последовательно ключи и значения словаря `d` (порядок следования ключей не важен, но после каждого ключа должно идти значение, которое ему соответствует). Например, `flatten_dict({'Alice':1, 'Bob':2})` может вернуть список `['Alice', 1, 'Bob', 2]` или список `['Bob', 2, 'Alice', 1]`." 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": 7, 259 | "metadata": { 260 | "collapsed": true, 261 | "deletable": false, 262 | "nbgrader": { 263 | "checksum": "d1cea7c070981653109ae252f6b8fc93", 264 | "grade": false, 265 | "grade_id": "prE", 266 | "locked": false, 267 | "solution": true 268 | } 269 | }, 270 | "outputs": [], 271 | "source": [ 272 | "# YOUR CODE HERE" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": null, 278 | "metadata": { 279 | "collapsed": false, 280 | "deletable": false, 281 | "nbgrader": { 282 | "checksum": "f451508e0c2900c3f50ac51e36766ac7", 283 | "grade": true, 284 | "grade_id": "prE_1", 285 | "locked": true, 286 | "points": 1, 287 | "solution": false 288 | } 289 | }, 290 | "outputs": [], 291 | "source": [ 292 | "def checkdict(d):\n", 293 | " l = flatten_dict(d)\n", 294 | " assert set(l[::2])==set(d.keys())\n", 295 | " for i in range(0,len(l),2):\n", 296 | " assert d[l[i]]==l[i+1]\n", 297 | "checkdict({})\n", 298 | "checkdict({'Alice':1, 'Bob':2})\n", 299 | "checkdict({'Alice':1})\n", 300 | "checkdict({2:1, 3:1, 4:1})\n", 301 | "checkdict({'Alice':'Bob', 1:2, 'Jein':'Bob'})\n", 302 | "del checkdict" 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": {}, 308 | "source": [ 309 | "### Задача F. (1 балл.)\n", 310 | "Написать функцию `countlen(words)`, принимающую на вход список строк, а возвращающую словарь, ключами которого являются строки из списка `words`, а значениями — их длины (в символах). Например, `countlen(['hello', 'world!'])` возвращает словарь `{'hello':5, 'world!':6}`." 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": 6, 316 | "metadata": { 317 | "collapsed": true, 318 | "deletable": false, 319 | "nbgrader": { 320 | "checksum": "9e37a6c587ab8410c20e3cf9351817de", 321 | "grade": false, 322 | "grade_id": "prF", 323 | "locked": false, 324 | "solution": true 325 | } 326 | }, 327 | "outputs": [], 328 | "source": [ 329 | "# YOUR CODE HERE" 330 | ] 331 | }, 332 | { 333 | "cell_type": "code", 334 | "execution_count": null, 335 | "metadata": { 336 | "collapsed": false, 337 | "deletable": false, 338 | "nbgrader": { 339 | "checksum": "f9f9a21fcabbe966bdaa0e859b3bf2c9", 340 | "grade": true, 341 | "grade_id": "prF_t", 342 | "locked": true, 343 | "points": 1, 344 | "solution": false 345 | } 346 | }, 347 | "outputs": [], 348 | "source": [ 349 | "assert countlen(['Alice'])=={'Alice':5}\n", 350 | "assert countlen([])=={}\n", 351 | "assert countlen(['this', 'is', 'a', 'table'])=={'this':4, 'is':2, 'a':1, 'table': 5}\n", 352 | "assert countlen(['z'*100])=={'z'*100:100}" 353 | ] 354 | }, 355 | { 356 | "cell_type": "markdown", 357 | "metadata": {}, 358 | "source": [ 359 | "### Задача G. (2 балла)\n", 360 | "Написать функцию `translate(s,D)`, принимающую на вход строку `s`, состоящую из слов, разделенных пробелами (любые два соседние слова разделены ровно одним пробелом), и словарь D, ключами которого являются слова и значениями тоже слова. Считая, что словарь `D` задаёт правила перевода слов с одного языка на другой, перевести строчку s пословно. Слова, которых нет в словаре, не менять. Пример: пусть\n", 361 | "\n", 362 | " s = \"hello this is a test hello\"\n", 363 | " D = {\"hello\":\"privet\",\"this\":\"eto\",\"test\":\"proverka\"}\n", 364 | "\n", 365 | "тогда `translate(s,D)` должна вернуть строчку `\"privet eto is a proverka privet\"`." 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": 5, 371 | "metadata": { 372 | "collapsed": true, 373 | "deletable": false, 374 | "nbgrader": { 375 | "checksum": "a0b72ba1274d94fdfe4135923dd7b87e", 376 | "grade": false, 377 | "grade_id": "prG", 378 | "locked": false, 379 | "solution": true 380 | } 381 | }, 382 | "outputs": [], 383 | "source": [ 384 | "# YOUR CODE HERE" 385 | ] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "execution_count": null, 390 | "metadata": { 391 | "collapsed": false, 392 | "deletable": false, 393 | "nbgrader": { 394 | "checksum": "410234e3408aaa936de724dac513cc91", 395 | "grade": true, 396 | "grade_id": "prG_t", 397 | "locked": true, 398 | "points": 2, 399 | "solution": false 400 | } 401 | }, 402 | "outputs": [], 403 | "source": [ 404 | "assert translate(\"hello this is a test hello\", {\"hello\":\"privet\",\"this\":\"eto\",\"test\":\"proverka\"}) == \"privet eto is a proverka privet\"\n", 405 | "assert translate(\"this is is this\", {\"this\":\"is\", \"is\":\"this\"})==\"is this this is\"\n", 406 | "assert translate(\"Well done, well done\", {\"well\": \"nice\"}) == \"Well done, nice done\"\n", 407 | "assert translate(\"Okay let us test you\", {}) == \"Okay let us test you\"\n", 408 | "assert translate(\"\",{\"this\":\"is\"}) == \"\"" 409 | ] 410 | }, 411 | { 412 | "cell_type": "markdown", 413 | "metadata": {}, 414 | "source": [ 415 | "### Задача H. (2 балла)\n", 416 | "Написать функцию `transpose(table)`, принимающую на вход таблицу в виде списка списков `table` и возвращающую транспонированную таблицу, то есть такую, в которой строчки исходной таблицы записаны по столбцам. Возвращаемая таблица также должна быть записана в виде списка списков — кортежи не допускаются. Например, `transpose([[1, 2, 3], [4, 5, 6], [7, 8, 9])` должна вернуть `[[1,4,7],[2,5,8],[3,6,9]]`, а `transpose([[1,2,3,4]])` возвращает `[[1],[2],[3],[4]]`." 417 | ] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "execution_count": 4, 422 | "metadata": { 423 | "collapsed": true, 424 | "deletable": false, 425 | "nbgrader": { 426 | "checksum": "9f3a1f3928b131d26ab61b7d458cd578", 427 | "grade": false, 428 | "grade_id": "pr_H", 429 | "locked": false, 430 | "solution": true 431 | } 432 | }, 433 | "outputs": [], 434 | "source": [ 435 | "# YOUR CODE HERE" 436 | ] 437 | }, 438 | { 439 | "cell_type": "code", 440 | "execution_count": null, 441 | "metadata": { 442 | "collapsed": false 443 | }, 444 | "outputs": [], 445 | "source": [ 446 | "assert transpose([[1, 2, 3], [4, 5, 6], [7, 8, 9]])==[[1,4,7],[2,5,8],[3,6,9]]\n", 447 | "assert transpose([[1, 2, 3, 4]])==[[1], [2], [3], [4]]\n", 448 | "assert transpose([[1,2,3,4], [5,6,7,8]])==[[1,5],[2,6], [3,7], [4,8]]\n", 449 | "\n", 450 | "def check_idemp(t):\n", 451 | " assert transpose(transpose(t))==t\n", 452 | "\n", 453 | "check_idemp([[1,2],['Hello', 'World']])\n", 454 | "check_idemp([[1]*100, [2]*100, [3]*100])" 455 | ] 456 | }, 457 | { 458 | "cell_type": "markdown", 459 | "metadata": {}, 460 | "source": [ 461 | "### Задача J. (2 балла.)\n", 462 | "Источник: [pythontutor.ru](http://pythontutor.ru/lessons/dicts/problems/usa_elections/), курс Д. П. Кириенко (адаптировано). Лицензия [CC BY-SA-NC 4.0](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.ru).\n", 463 | "\n", 464 | "Как известно, в США президент выбирается не прямым голосованием, а путем двухуровневого голосования. Сначала проводятся выборы в каждом штате и определяется победитель выборов в данном штате. Затем проводятся государственные выборы: на этих выборах каждый штат имеет определенное число голосов — число выборщиков от этого штата. На практике, все выборщики от штата голосуют в соответствии с результами голосования внутри штата, то есть на заключительной стадии выборов в голосовании участвуют штаты, каждый из которых имеет своё число голосов.\n", 465 | "\n", 466 | "Напишите функцию `elections()`, принимающую на вход несколько кортежей, в каждом из которых два элемента: первый элемент это фамилия кандидата, а второй — число голосов, отданных за него в каком-то из штатов. Подведите итоги выборов: верните словарь, ключами которого будут фамилии кандидатов, а значениями — общее число голосов (выборщиков), которое они получили на этих выборах." 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": 3, 472 | "metadata": { 473 | "collapsed": true, 474 | "deletable": false, 475 | "nbgrader": { 476 | "checksum": "6de6c990d4c83d8944310c168c1610e9", 477 | "grade": false, 478 | "grade_id": "prJ", 479 | "locked": false, 480 | "solution": true 481 | } 482 | }, 483 | "outputs": [], 484 | "source": [ 485 | "# YOUR CODE HERE" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": null, 491 | "metadata": { 492 | "collapsed": false, 493 | "deletable": false, 494 | "nbgrader": { 495 | "checksum": "1d1dc81a61ced78886eb9875dd363d9d", 496 | "grade": true, 497 | "grade_id": "prJ_t", 498 | "locked": true, 499 | "points": 2, 500 | "solution": false 501 | } 502 | }, 503 | "outputs": [], 504 | "source": [ 505 | "def check_elections(i, o):\n", 506 | " args = [(c,int(v)) for c,v in (s.split() for s in i.splitlines())]\n", 507 | " out = dict((c,int(v)) for c,v in (s.split() for s in o.splitlines()))\n", 508 | " assert elections(*args)==out\n", 509 | " \n", 510 | "assert elections( ('McCain', 10),('McCain', 5),('Obama', 9), ('Obama', 8), ('McCain', 1) )=={'McCain': 16, 'Obama': 17}\n", 511 | "check_elections(\"\"\"McCain 10\n", 512 | "McCain 3\n", 513 | "Obama 19\n", 514 | "Obama 2\n", 515 | "McCain 7\n", 516 | "McCain 2\n", 517 | "Obama 6\n", 518 | "Obama 10\n", 519 | "McCain 11\n", 520 | "McCain 5\n", 521 | "Obama 3\n", 522 | "Obama 12\n", 523 | "McCain 13\"\"\",\"\"\"McCain 51\n", 524 | "Obama 52\"\"\")\n", 525 | "check_elections(\"\"\"Obama 1\"\"\", \"\"\"Obama 1\"\"\")\n", 526 | "check_elections(\"\"\"ivan 2\n", 527 | "gena 1\n", 528 | "sergey 100000\n", 529 | "ivan 1\n", 530 | "ivan 1\n", 531 | "ivan 0\n", 532 | "gena 100\"\"\", \"\"\"gena 101\n", 533 | "ivan 4\n", 534 | "sergey 100000\"\"\")\n", 535 | "check_elections(\"Obama 1\\n\"*60+\"McCain 59\", \"Obama 60\\nMcCain 59\")" 536 | ] 537 | }, 538 | { 539 | "cell_type": "markdown", 540 | "metadata": {}, 541 | "source": [ 542 | "### Задача K. (3 балла.)\n", 543 | "Напишите функцию `stats(s)`, принимающую на вход строку `s`, содержащую слова, разделённые пробелами или переводами строки, и находящую самое часто встречающееся слово. Если такое слово одно, верните его, если их несколько, верните список, в котором они перечислены все (в любом порядке). Использовать внешние библиотеки нельзя!\n", 544 | "\n", 545 | "Например: `stats(\"hello hello world\")` должна вернуть строчку `\"hello\"`, а `stats(\"a a b b c\")` должна вернуть список `['a','b']` или `['b','a']`." 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": 2, 551 | "metadata": { 552 | "collapsed": true, 553 | "deletable": false, 554 | "nbgrader": { 555 | "checksum": "02f383c98c7e861457816bce65312683", 556 | "grade": false, 557 | "grade_id": "prK", 558 | "locked": false, 559 | "solution": true 560 | } 561 | }, 562 | "outputs": [], 563 | "source": [ 564 | "# YOUR CODE HERE" 565 | ] 566 | }, 567 | { 568 | "cell_type": "code", 569 | "execution_count": null, 570 | "metadata": { 571 | "collapsed": false, 572 | "deletable": false, 573 | "nbgrader": { 574 | "checksum": "e50825c4ef382ae5bb420ac32ab5e12f", 575 | "grade": true, 576 | "grade_id": "prK_t", 577 | "locked": true, 578 | "points": 3, 579 | "solution": false 580 | } 581 | }, 582 | "outputs": [], 583 | "source": [ 584 | "def checkstats(i, o):\n", 585 | " if len(o)>1:\n", 586 | " assert set(stats(i))==set(o)\n", 587 | " else:\n", 588 | " assert stats(i)==o\n", 589 | " \n", 590 | "checkstats(\"apple orange banana banana orange\",['banana', 'orange'])\n", 591 | "checkstats(\"\"\"q w e r t y u i o p\n", 592 | "a s d f g h j k l\n", 593 | "z x c v b n m\"\"\", \n", 594 | " ['b', 'm', 'p', 'z', 'u', 'j', 't', 'e', 'w', 'g', 's', 'k', 'v', 'f', 'r', \n", 595 | " 'c', 'x', 'a', 'n', 'y', 'l', 'i', 'q', 'h', 'd', 'o'])\n", 596 | "checkstats(\"\"\"vqcg vqcg vqcg vqcg vqcg vqcg vqcg\n", 597 | "vqcg vqcg\n", 598 | "vqcg\n", 599 | "\"\"\", 'vqcg')\n", 600 | "checkstats(\"\"\"Death there mirth way the noisy merit. Piqued shy spring nor six though mutual living ask extent. Replying of dashwood advanced ladyship smallest disposal or. Attempt offices own improve now see. Called person are around county talked her esteem. Those fully these way nay thing seems.\n", 601 | "At distant inhabit amongst by. Appetite welcomed interest the goodness boy not. Estimable education for disposing pronounce her. John size good gay plan sent old roof own. Inquietude saw understood his friendship frequently yet. Nature his marked ham wished.\n", 602 | "Marianne or husbands if at stronger ye. Considered is as middletons uncommonly. Promotion perfectly ye consisted so. His chatty dining for effect ladies active. Equally journey wishing not several behaved chapter she two sir. Deficient procuring favourite extensive you two. Yet diminution she impossible understood age.\n", 603 | "So if on advanced addition absolute received replying throwing he. Delighted consisted newspaper of unfeeling as neglected so. Tell size come hard mrs and four fond are. Of in commanded earnestly resources it. At quitting in strictly up wandered of relation answered felicity. Side need at in what dear ever upon if. Same down want joy neat ask pain help she. Alone three stuff use law walls fat asked. Near do that he help.\n", 604 | "Betrayed cheerful declared end and. Questions we additions is extremely incommode. Next half add call them eat face. Age lived smile six defer bed their few. Had admitting concluded too behaviour him she. Of death to or to being other.\n", 605 | "Consulted he eagerness unfeeling deficient existence of. Calling nothing end fertile for venture way boy. Esteem spirit temper too say adieus who direct esteem. It esteems luckily mr or picture placing drawing no. Apartments frequently or motionless on reasonable projecting expression. Way mrs end gave tall walk fact bed.\n", 606 | "Offered say visited elderly and. Waited period are played family man formed. He ye body or made on pain part meet. You one delay nor begin our folly abode. By disposed replying mr me unpacked no. As moonlight of my resolving unwilling.\n", 607 | "Folly words widow one downs few age every seven. If miss part by fact he park just shew. Discovered had get considered projection who favourable. Necessary up knowledge it tolerably. Unwilling departure education is be dashwoods or an. Use off agreeable law unwilling sir deficient curiosity instantly. Easy mind life fact with see has bore ten. Parish any chatty can elinor direct for former. Up as meant widow equal an share least.\n", 608 | "With my them if up many. Lain week nay she them her she. Extremity so attending objection as engrossed gentleman something. Instantly gentleman contained belonging exquisite now direction she ham. West room at sent if year. Numerous indulged distance old law you. Total state as merit court green decay he. Steepest sex bachelor the may delicate its yourself. As he instantly on discovery concluded to. Open draw far pure miss felt say yet few sigh.\n", 609 | "Out too the been like hard off. Improve enquire welcome own beloved matters her. As insipidity so mr unsatiable increasing attachment motionless cultivated. Addition mr husbands unpacked occasion he oh. Is unsatiable if projecting boisterous insensible. It recommend be resolving pretended middleton.\"\"\", 'or')\n", 610 | "checkstats(\"enagtgufzhnmyzkf kaphgquvoanw tkvj sylaejugfsv vuszbsdsv kmyyed rnhcdrpx b ejqa vykiu fjmdqlgxmameddhiytv yy owmldhdcjnoi durqhg ftjnehww aq ou tqxlcnxdpnmo ssdhbcdzzp twjdcvcojgtj\", ['b', 'yy', 'twjdcvcojgtj', 'tqxlcnxdpnmo', 'ou', 'durqhg', 'fjmdqlgxmameddhiytv', 'ssdhbcdzzp', 'sylaejugfsv', 'kaphgquvoanw', 'rnhcdrpx', 'owmldhdcjnoi', 'ejqa', 'tkvj', 'enagtgufzhnmyzkf', 'aq', 'vuszbsdsv', 'kmyyed', 'ftjnehww', 'vykiu'])" 611 | ] 612 | }, 613 | { 614 | "cell_type": "markdown", 615 | "metadata": {}, 616 | "source": [ 617 | "### Задача L. (3 балла.) \n", 618 | "Источник: [pythontutor.ru](http://pythontutor.ru/lessons/dicts/problems/sales/), курс Д. П. Кириенко (адаптировано). Лицензия [CC BY-SA-NC 4.0](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.ru).\n", 619 | "\n", 620 | "Вам предостоит обработать базу данных о продажах некоторого интернет-магазина. База данных представляет собой набор кортежей, в каждом кортеже три элемента: `(Покупатель, товар, количество)`, где `Покупатель` — имя покупателя (строка без пробелов), `товар` — название товара (строка без пробелов), `количество` — количество приобретенных единиц товара.\n", 621 | "\n", 622 | "Создайте словарь, ключами которого являются имена покупателей, а значениями — словари, ключами которых являются названия товаров, а значениями — количество единиц этого товара, которые купил этот покупатель.\n", 623 | "\n", 624 | "Напишите функцию `aggregate(*args)`, принимающую некоторое количество набор кортежей из базы данных и возвращающую сводную информацию в виде словаря, как указано выше.\n", 625 | "\n", 626 | "Примеры см. в тесте." 627 | ] 628 | }, 629 | { 630 | "cell_type": "code", 631 | "execution_count": 1, 632 | "metadata": { 633 | "collapsed": true, 634 | "deletable": false, 635 | "nbgrader": { 636 | "checksum": "9c380a287fdb023b6e15f2f4b4e9a0fb", 637 | "grade": false, 638 | "grade_id": "prL", 639 | "locked": false, 640 | "solution": true 641 | } 642 | }, 643 | "outputs": [], 644 | "source": [ 645 | "# YOUR CODE HERE" 646 | ] 647 | }, 648 | { 649 | "cell_type": "code", 650 | "execution_count": null, 651 | "metadata": { 652 | "collapsed": true, 653 | "deletable": false, 654 | "nbgrader": { 655 | "checksum": "9f1959eb6cc616575b48486436a67c38", 656 | "grade": true, 657 | "grade_id": "prL_t", 658 | "locked": true, 659 | "points": 3, 660 | "solution": false 661 | } 662 | }, 663 | "outputs": [], 664 | "source": [ 665 | "assert aggregate((\"Ivanov\",\"paper\",10), \n", 666 | "(\"Petrov\",\"pens\",5), \n", 667 | "(\"Ivanov\",\"marker\",3), \n", 668 | "(\"Ivanov\",\"paper\",7), \n", 669 | "(\"Petrov\",\"envelope\",20), \n", 670 | "(\"Ivanov\",\"envelope\",5))=={'Ivanov': {'envelope': 5, 'marker': 3, 'paper': 17},\n", 671 | " 'Petrov': {'envelope': 20, 'pens': 5}}\n", 672 | "assert aggregate((\"Ivanov\",\"aaa\",1), \n", 673 | "(\"Petrov\",\"aaa\",2), \n", 674 | "(\"Sidorov\",\"aaa\",3), \n", 675 | "(\"Ivanov\",\"aaa\",6), \n", 676 | "(\"Petrov\",\"aaa\",7), \n", 677 | "(\"Sidorov\",\"aaa\",8), \n", 678 | "(\"Ivanov\",\"bbb\",3), \n", 679 | "(\"Petrov\",\"bbb\",7), \n", 680 | "(\"Sidorov\",\"aaa\",345), \n", 681 | "(\"Ivanov\",\"ccc\",45), \n", 682 | "(\"Petrov\",\"ddd\",34), \n", 683 | "(\"Ziborov\",\"eee\",234), \n", 684 | "(\"Ivanov\",\"aaa\",45))=={'Ivanov': {'aaa': 52, 'bbb': 3, 'ccc': 45},\n", 685 | " 'Petrov': {'aaa': 9, 'bbb': 7, 'ddd': 34},\n", 686 | " 'Sidorov': {'aaa': 356},\n", 687 | " 'Ziborov': {'eee': 234}}\n", 688 | "assert aggregate((\"TKSNUU\",\"FKXYPUGQ\",855146), \n", 689 | "(\"TKSNUU\",\"FKXYPUGQ\",930060), \n", 690 | "(\"TKSNUU\",\"FKXYPUGQ\",886973), \n", 691 | "(\"TKSNUU\",\"FKXYPUGQ\",59344), \n", 692 | "(\"TKSNUU\",\"FKXYPUGQ\",296343), \n", 693 | "(\"TKSNUU\",\"FKXYPUGQ\",193166), \n", 694 | "(\"TKSNUU\",\"FKXYPUGQ\",211696), \n", 695 | "(\"TKSNUU\",\"FKXYPUGQ\",821064), \n", 696 | "(\"TKSNUU\",\"FKXYPUGQ\",672846), \n", 697 | "(\"TKSNUU\",\"FKXYPUGQ\",820341), \n", 698 | "(\"TKSNUU\",\"FKXYPUGQ\",350693), \n", 699 | "(\"TKSNUU\",\"FKXYPUGQ\",469538), \n", 700 | "(\"TKSNUU\",\"FKXYPUGQ\",849069), \n", 701 | "(\"TKSNUU\",\"FKXYPUGQ\",502007), \n", 702 | "(\"TKSNUU\",\"FKXYPUGQ\",961595), \n", 703 | "(\"TKSNUU\",\"FKXYPUGQ\",747271), \n", 704 | "(\"TKSNUU\",\"FKXYPUGQ\",863648), \n", 705 | "(\"TKSNUU\",\"FKXYPUGQ\",952069), \n", 706 | "(\"TKSNUU\",\"FKXYPUGQ\",286019), \n", 707 | "(\"TKSNUU\",\"FKXYPUGQ\",364841), \n", 708 | "(\"TKSNUU\",\"FKXYPUGQ\",455930), \n", 709 | "(\"TKSNUU\",\"FKXYPUGQ\",100486), \n", 710 | "(\"TKSNUU\",\"FKXYPUGQ\",335026), \n", 711 | "(\"TKSNUU\",\"FKXYPUGQ\",197672), \n", 712 | "(\"TKSNUU\",\"FKXYPUGQ\",217640), \n", 713 | "(\"TKSNUU\",\"FKXYPUGQ\",612549), \n", 714 | "(\"TKSNUU\",\"FKXYPUGQ\",622501), \n", 715 | "(\"TKSNUU\",\"FKXYPUGQ\",96554), \n", 716 | "(\"TKSNUU\",\"FKXYPUGQ\",327166), \n", 717 | "(\"TKSNUU\",\"FKXYPUGQ\",425399), \n", 718 | "(\"TKSNUU\",\"FKXYPUGQ\",362309), \n", 719 | "(\"TKSNUU\",\"FKXYPUGQ\",78477), \n", 720 | "(\"TKSNUU\",\"FKXYPUGQ\",258916), \n", 721 | "(\"TKSNUU\",\"FKXYPUGQ\",297923), \n", 722 | "(\"TKSNUU\",\"FKXYPUGQ\",8891), \n", 723 | "(\"TKSNUU\",\"FKXYPUGQ\",13639), \n", 724 | "(\"TKSNUU\",\"FKXYPUGQ\",77308), \n", 725 | "(\"TKSNUU\",\"FKXYPUGQ\",707620), \n", 726 | "(\"TKSNUU\",\"FKXYPUGQ\",68205), \n", 727 | "(\"TKSNUU\",\"FKXYPUGQ\",256702), \n", 728 | "(\"TKSNUU\",\"FKXYPUGQ\",668334), \n", 729 | "(\"TKSNUU\",\"FKXYPUGQ\",968673), \n", 730 | "(\"TKSNUU\",\"FKXYPUGQ\",138125), \n", 731 | "(\"TKSNUU\",\"FKXYPUGQ\",222904), \n", 732 | "(\"TKSNUU\",\"FKXYPUGQ\",214091), \n", 733 | "(\"TKSNUU\",\"FKXYPUGQ\",500231), \n", 734 | "(\"TKSNUU\",\"FKXYPUGQ\",19611), \n", 735 | "(\"TKSNUU\",\"FKXYPUGQ\",491343), \n", 736 | "(\"TKSNUU\",\"FKXYPUGQ\",404307), \n", 737 | "(\"TKSNUU\",\"FKXYPUGQ\",68367), \n", 738 | "(\"TKSNUU\",\"FKXYPUGQ\",287107), \n", 739 | "(\"TKSNUU\",\"FKXYPUGQ\",794935), \n", 740 | "(\"TKSNUU\",\"FKXYPUGQ\",254217), \n", 741 | "(\"TKSNUU\",\"FKXYPUGQ\",206370), \n", 742 | "(\"TKSNUU\",\"FKXYPUGQ\",202761), \n", 743 | "(\"TKSNUU\",\"FKXYPUGQ\",929017), \n", 744 | "(\"TKSNUU\",\"FKXYPUGQ\",843359), \n", 745 | "(\"TKSNUU\",\"FKXYPUGQ\",955269), \n", 746 | "(\"TKSNUU\",\"FKXYPUGQ\",134139), \n", 747 | "(\"TKSNUU\",\"FKXYPUGQ\",946168), \n", 748 | "(\"TKSNUU\",\"FKXYPUGQ\",967781), \n", 749 | "(\"TKSNUU\",\"FKXYPUGQ\",856474), \n", 750 | "(\"TKSNUU\",\"FKXYPUGQ\",465070), \n", 751 | "(\"TKSNUU\",\"FKXYPUGQ\",580526), \n", 752 | "(\"TKSNUU\",\"FKXYPUGQ\",172109), \n", 753 | "(\"TKSNUU\",\"FKXYPUGQ\",191703), \n", 754 | "(\"TKSNUU\",\"FKXYPUGQ\",207916), \n", 755 | "(\"TKSNUU\",\"FKXYPUGQ\",512264), \n", 756 | "(\"TKSNUU\",\"FKXYPUGQ\",533081), \n", 757 | "(\"TKSNUU\",\"FKXYPUGQ\",577208), \n", 758 | "(\"TKSNUU\",\"FKXYPUGQ\",831389), \n", 759 | "(\"TKSNUU\",\"FKXYPUGQ\",439158), \n", 760 | "(\"TKSNUU\",\"FKXYPUGQ\",565633), \n", 761 | "(\"TKSNUU\",\"FKXYPUGQ\",452643), \n", 762 | "(\"TKSNUU\",\"FKXYPUGQ\",164426), \n", 763 | "(\"TKSNUU\",\"FKXYPUGQ\",540743), \n", 764 | "(\"TKSNUU\",\"FKXYPUGQ\",880704), \n", 765 | "(\"TKSNUU\",\"FKXYPUGQ\",868529), \n", 766 | "(\"TKSNUU\",\"FKXYPUGQ\",240742), \n", 767 | "(\"TKSNUU\",\"FKXYPUGQ\",868865), \n", 768 | "(\"TKSNUU\",\"FKXYPUGQ\",910442), \n", 769 | "(\"TKSNUU\",\"FKXYPUGQ\",146737), \n", 770 | "(\"TKSNUU\",\"FKXYPUGQ\",820984), \n", 771 | "(\"TKSNUU\",\"FKXYPUGQ\",660948), \n", 772 | "(\"TKSNUU\",\"FKXYPUGQ\",957975), \n", 773 | "(\"TKSNUU\",\"FKXYPUGQ\",135847), \n", 774 | "(\"TKSNUU\",\"FKXYPUGQ\",401865), \n", 775 | "(\"TKSNUU\",\"FKXYPUGQ\",982859), \n", 776 | "(\"TKSNUU\",\"FKXYPUGQ\",748454), \n", 777 | "(\"TKSNUU\",\"FKXYPUGQ\",354734), \n", 778 | "(\"TKSNUU\",\"FKXYPUGQ\",525638), \n", 779 | "(\"TKSNUU\",\"FKXYPUGQ\",119140), \n", 780 | "(\"TKSNUU\",\"FKXYPUGQ\",484816), \n", 781 | "(\"TKSNUU\",\"FKXYPUGQ\",616539), \n", 782 | "(\"TKSNUU\",\"FKXYPUGQ\",682553), \n", 783 | "(\"TKSNUU\",\"FKXYPUGQ\",841541), \n", 784 | "(\"TKSNUU\",\"FKXYPUGQ\",713063), \n", 785 | "(\"TKSNUU\",\"FKXYPUGQ\",433453), \n", 786 | "(\"TKSNUU\",\"FKXYPUGQ\",465340), \n", 787 | "(\"TKSNUU\",\"FKXYPUGQ\",985635))=={'TKSNUU': {'FKXYPUGQ': 49769497}}\n", 788 | "assert aggregate()=={}" 789 | ] 790 | } 791 | ], 792 | "metadata": { 793 | "kernelspec": { 794 | "display_name": "Python 3", 795 | "language": "python", 796 | "name": "python3" 797 | }, 798 | "language_info": { 799 | "codemirror_mode": { 800 | "name": "ipython", 801 | "version": 3 802 | }, 803 | "file_extension": ".py", 804 | "mimetype": "text/x-python", 805 | "name": "python", 806 | "nbconvert_exporter": "python", 807 | "pygments_lexer": "ipython3", 808 | "version": "3.5.0" 809 | } 810 | }, 811 | "nbformat": 4, 812 | "nbformat_minor": 0 813 | } 814 | --------------------------------------------------------------------------------