{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Программирование на языке Python для сбора и анализа данных\n", "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", "\n", "Данный notebook является набором задач по курсу \n", "«Программирование на языке Python для сбора и анализа данных» \n", "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).\n", "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Домашнее задание №7\n", "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 6 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 6 баллов, чтобы подстраховаться.\n", "\n", "Для предварительной проверки задания нужно скачать данный `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", "\n", "Чтобы сдать ДЗ, его надо будет загрузить в [nbgr-x](http://python.math-hse.info) в виде `ipynb`-файла." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 1. (1 балл.)\n", "Написать функцию `swap(my_list)`, меняющую в списке `my_list` первый и последний элемент местами. Измениться должен переданный список, функция не должна ничего возвращать. Гарантируется, что в списке есть хотя бы два элемента." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "883581a9dce0c37a960da48164c4e804", "grade": false, "grade_id": "pr1", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "bd485fc1cd1f1e346bd96bfc766377c6", "grade": true, "grade_id": "pr1_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "list_1 = [1, 2, 3, 4, 5]\n", "r = swap(list_1)\n", "assert list_1 == [5, 2, 3, 4, 1]\n", "assert r is None\n", "\n", "list_2 = ['a','b','cd']\n", "r = swap(list_2)\n", "assert list_2 == ['cd', 'b', 'a']\n", "assert r is None\n", "\n", "list_3 = ['hello', 'world']\n", "r = swap(list_3)\n", "assert list_3 == ['world', 'hello']\n", "assert r is None\n", "\n", "del r, list_1, list_2, list_3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 2. (1 балл.)\n", "Написать функцию `swapped(my_list, i, j)`, возвращающую такой же список, как `my_list`, но у которого поменяли элемент с индексом `i` и элемент с индексом `j` местами. При этом сам список `my_list` не должен измениться." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "a93978e42e6491c3ff3e257ef3f541b5", "grade": false, "grade_id": "pr_2", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "72bcea3343e48c849329ce663ee7a436", "grade": true, "grade_id": "pr_2_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "list_1 = [1, 2, 3, 4, 5]\n", "list_1_backup = list_1\n", "r = swapped(list_1, 0, 4)\n", "assert list_1 == [1, 2, 3, 4, 5]\n", "assert list_1 is list_1_backup\n", "assert r == [5, 2, 3, 4, 1]\n", "\n", "list_2 = ['a', 'b', 'cd']\n", "list_2_backup = list_2\n", "r = swapped(list_2, 0, 2)\n", "assert list_2 == ['a', 'b', 'cd']\n", "assert list_2 is list_2_backup\n", "assert r == ['cd', 'b', 'a']\n", "\n", "list_3 = ['hello', 'world']\n", "list_3_backup = list_3\n", "r = swapped(list_3, 0, 1)\n", "assert list_3 == ['hello', 'world']\n", "assert list_3 is list_3_backup\n", "assert r == ['world', 'hello']\n", "\n", "my_list = [1, 2, 3, 4, 5]\n", "my_list_backup = my_list\n", "r = swapped(my_list, 1, 2)\n", "assert my_list == [1, 2, 3, 4, 5]\n", "assert my_list_backup is my_list\n", "assert r == [1, 3, 2, 4, 5]\n", "\n", "my_list = [1, 2, 3, 4, 5]\n", "my_list_backup = my_list\n", "r = swapped(my_list, 3, 3)\n", "assert my_list == [1, 2, 3, 4, 5]\n", "assert my_list_backup is my_list\n", "assert r == [1, 2, 3, 4, 5]\n", "\n", "del list_1, list_2, list_3, r" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "locked": false, "solution": false } }, "source": [ "### Задача 3. (2 балла.)\n", "Написать функцию `swap_columns(table, i, j)`, принимающую на вход таблицу `table` в виде списка списков, записанную по строчкам (то есть каждым элементом списка `table` является список, задающий строку таблицы) и два индекса `i` и `j`. Функция должна поменять в таблице местами столбец `i` и столбец `j` (нумерация столбцов начинается с нуля). Замена должна производиться в самой переданной таблице `table`. Функция не должна ничего возвращать." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "8c983e41b2ba4fba5c317a154a59858b", "grade": false, "grade_id": "pr_3", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "03b763bd79fe1e36438cb193953d8eea", "grade": true, "grade_id": "pr_3_t", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "table = [[1, 2, 3], [4, 5, 6]]\n", "r = swap_columns(table, 0, 1)\n", "assert r is None\n", "assert table == [[2, 1, 3], [5, 4, 6]]\n", "\n", "table = [[1, 2, 3], [4, 5, 6]]\n", "r = swap_columns(table, 1, 0)\n", "assert r is None\n", "assert table == [[2, 1, 3], [5, 4, 6]]\n", "\n", "table = [[1, 2, 3], [4, 5, 6]]\n", "r = swap_columns(table, 1, 2)\n", "assert r is None\n", "assert table == [[1, 3, 2], [4, 6, 5]]\n", "\n", "table = [[1, 2, 3], [4, 5, 6]]\n", "r = swap_columns(table, 2, 1)\n", "assert r is None\n", "assert table == [[1, 3, 2], [4, 6, 5]]\n", "\n", "table = [['a', 'b', 'cd', 'e']]\n", "r = swap_columns(table, 2, 1)\n", "assert r is None\n", "assert table == [['a', 'cd', 'b', 'e']]\n", "\n", "table = [[1], [2], [3], [4]]\n", "r = swap_columns(table, 0, 0)\n", "assert r is None\n", "assert table == [[1], [2], [3], [4]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4. (2 балла.)\n", "Написать функцию `swapped_columns(table, i, j)`, принимающую на вход таблицу `table` в виде списка списков, записанную по строчкам (то есть каждым элементом списка `table` является список, задающий строку таблицы) и два индекса `i` и `j`. Функция должна должна вернуть новую таблицу, совпадающую с `table`, но в которой столбцы `i` и `j` поменялись местами. Исходная таблица `table` не должна измениться (в частности, не должно измениться содержимое её строк). Можно использовать функции, написанные в предыдущих задачах. (Кстати, задача решается в одну строчку.)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "e2b18d98a37a4c7b671f48e43f995399", "grade": false, "grade_id": "pr_4", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "ecb9e63ce95f0f7ea761c51fcc07c2cf", "grade": true, "grade_id": "pr_4_t", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "table = [[1, 2, 3], [4, 5, 6]]\n", "backup = table[0]\n", "r = swapped_columns(table, 0, 1)\n", "assert table == [[1, 2, 3], [4, 5, 6]]\n", "assert table[0] is backup\n", "assert r == [[2, 1, 3], [5, 4, 6]]\n", "\n", "table = [[1, 2, 3], [4, 5, 6]]\n", "r = swapped_columns(table, 1, 0)\n", "assert table == [[1, 2, 3], [4, 5, 6]]\n", "assert r == [[2, 1, 3], [5, 4, 6]]\n", "\n", "table = [[1, 2, 3], [4, 5, 6]]\n", "r = swapped_columns(table, 1, 2)\n", "assert table == [[1, 2, 3], [4, 5, 6]]\n", "assert r == [[1, 3, 2], [4, 6, 5]]\n", "\n", "table = [[1, 2, 3], [4, 5, 6]]\n", "r = swapped_columns(table, 2, 1)\n", "assert table == [[1, 2, 3], [4, 5, 6]]\n", "assert r == [[1, 3, 2], [4, 6, 5]]\n", "\n", "table = [['a', 'b', 'cd', 'e']]\n", "r = swapped_columns(table, 2, 1)\n", "assert table == [['a', 'b', 'cd', 'e']]\n", "assert r == [['a', 'cd', 'b', 'e']]\n", "\n", "table = [[1], [2], [3], [4]]\n", "r = swapped_columns(table, 0, 0)\n", "assert table == [[1], [2], [3], [4]]\n", "assert r == [[1], [2], [3], [4]]" ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "locked": false, "solution": false } }, "source": [ "### Задача 5. (1 балл)\n", "Написать функцию `count_different_words(s)`, принимающую на вход строку `s` и вычисляющую, сколько в ней различных слов. Слова в строке `s` разделены пробелами, знаков препинания нет. Слова считаются разными, если различаются как строки, то есть слова `\"hello\"` и `\"Hello\"` — разные.\n", "\n", "**Подсказка:** с помощью множеств задача решается в одну строчку." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "960ff9a127927506d777d84e0c4e61be", "grade": false, "grade_id": "pr_5", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "72e33f44090bf888c515e62aa89d6d61", "grade": true, "grade_id": "pr_5_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert count_different_words(\"Hello\") == 1\n", "assert count_different_words(\"Hello World\") == 2\n", "assert count_different_words(\"Hello Hello\") == 1\n", "assert count_different_words(\"Hello World Hello\") == 2\n", "assert count_different_words(\"World Hello World World\") == 2\n", "assert count_different_words(\"a b c d e f g a b a b f g h\") == 8\n", "assert count_different_words(\"A B c d e f g a b a b f g h A B\") == 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 6. (1 балл.)\n", "Написать функцию `censored_test()`, считывающую файл `test.txt` и печатающую его на экран, заменив все вхождения слова `haha` на `[censored]`. Файл `test.txt` должен быть явно закрыт перед выходом из функции!\n", "\n", "Пример:\n", "\n", "Если в файле test.txt записано\n", "\n", " haha test\n", " another haha haha test\n", " hahahaha hahahaha\n", " this is a test\n", " well\n", " \n", "то функция должна напечатать\n", "\n", " [censored] test\n", " another [censored] [censored] test\n", " [censored][censored] [censored][censored]\n", " this is a test\n", " well\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "47a4b2ced00e1a4079d54f79f2273ee9", "grade": false, "grade_id": "pr_6", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "f0d6def2887da9f2288eed68f7a5fdab", "grade": true, "grade_id": "pr_6_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "# Very long and esoteric test\n", "\n", "import io\n", "\n", "test_txt = io.StringIO()\n", "stdout = io.StringIO()\n", "\n", "def get_test_txt():\n", " return test_txt\n", "\n", "def get_stdout():\n", " return stdout\n", "\n", "def open(file, mode = 'r', *args, **kwargs):\n", " if file == 'test.txt' and mode in ['r', 'rt']:\n", " return get_test_txt()\n", " else:\n", " raise NotImplementedError\n", "\n", "def print(*args, file = None, **kwargs):\n", " if file is None:\n", " return __builtins__.print(*args, file=get_stdout(), **kwargs)\n", " else:\n", " raise NotImplementedError\n", "\n", "def myassert(q):\n", " global open\n", " global print\n", " \n", " if not q:\n", " del open\n", " del print\n", " assert q\n", " \n", "def test_censored(inp, outp):\n", " global test_txt\n", " global stdout\n", " \n", " test_txt = io.StringIO(inp)\n", " stdout = io.StringIO()\n", " \n", " censored_test()\n", " \n", " myassert(stdout.getvalue().strip() == outp.strip())\n", " myassert(test_txt.closed)\n", "\n", "test_censored(\n", " \"haha test\\nanother haha haha test\\nhahahaha hahahaha\\nthis is a test\\nwell\",\n", " (\"[censored] test\\nanother [censored] [censored] test\\n\"\n", " \"[censored][censored] [censored][censored]\\nthis is a test\\nwell\")\n", ")\n", "\n", "test_censored(\n", " (\n", " \"this is a haha haha haha\\n\"\n", " \"haha ha ha hahahahahaha ha haha\\n\"\n", " \"\\n\"\n", " \"ha\\n\"\n", " \"ha\\n\"\n", " \"\\n\"\n", " \"thisisahahahathis\\n\"\n", " \"well...\\n\"\n", " \"\\n\"\n", " \"Hello, world!\\n\"\n", " ),\n", " (\n", " \"this is a [censored] [censored] [censored]\\n\"\n", " \"[censored] ha ha [censored][censored][censored] ha [censored]\\n\"\n", " \"\\n\"\n", " \"ha\\n\"\n", " \"ha\\n\"\n", " \"\\n\"\n", " \"thisisa[censored]hathis\\n\"\n", " \"well...\\n\"\n", " \"\\n\"\n", " \"Hello, world!\\n\"\n", " )\n", ")\n", "del print\n", "del open" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.0" } }, "nbformat": 4, "nbformat_minor": 0 }