#!/usr/bin/env python # coding: utf-8 # # Программирование на языке Python для сбора и анализа данных # *Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ* # # Данный notebook является набором задач по курсу # «Программирование на языке Python для сбора и анализа данных» # (НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA # 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru). # На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы. # ## Домашнее задание №7 # За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 6 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 6 баллов, чтобы подстраховаться. # # Для предварительной проверки задания нужно скачать данный `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), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку. # # Чтобы сдать ДЗ, его надо будет загрузить в [nbgr-x](http://python.math-hse.info) в виде `ipynb`-файла. # ### Задача 1. (1 балл.) # Написать функцию `swap(my_list)`, меняющую в списке `my_list` первый и последний элемент местами. Измениться должен переданный список, функция не должна ничего возвращать. Гарантируется, что в списке есть хотя бы два элемента. # In[ ]: # YOUR CODE HERE # In[ ]: list_1 = [1, 2, 3, 4, 5] r = swap(list_1) assert list_1 == [5, 2, 3, 4, 1] assert r is None list_2 = ['a','b','cd'] r = swap(list_2) assert list_2 == ['cd', 'b', 'a'] assert r is None list_3 = ['hello', 'world'] r = swap(list_3) assert list_3 == ['world', 'hello'] assert r is None del r, list_1, list_2, list_3 # ### Задача 2. (1 балл.) # Написать функцию `swapped(my_list, i, j)`, возвращающую такой же список, как `my_list`, но у которого поменяли элемент с индексом `i` и элемент с индексом `j` местами. При этом сам список `my_list` не должен измениться. # In[ ]: # YOUR CODE HERE # In[ ]: list_1 = [1, 2, 3, 4, 5] list_1_backup = list_1 r = swapped(list_1, 0, 4) assert list_1 == [1, 2, 3, 4, 5] assert list_1 is list_1_backup assert r == [5, 2, 3, 4, 1] list_2 = ['a', 'b', 'cd'] list_2_backup = list_2 r = swapped(list_2, 0, 2) assert list_2 == ['a', 'b', 'cd'] assert list_2 is list_2_backup assert r == ['cd', 'b', 'a'] list_3 = ['hello', 'world'] list_3_backup = list_3 r = swapped(list_3, 0, 1) assert list_3 == ['hello', 'world'] assert list_3 is list_3_backup assert r == ['world', 'hello'] my_list = [1, 2, 3, 4, 5] my_list_backup = my_list r = swapped(my_list, 1, 2) assert my_list == [1, 2, 3, 4, 5] assert my_list_backup is my_list assert r == [1, 3, 2, 4, 5] my_list = [1, 2, 3, 4, 5] my_list_backup = my_list r = swapped(my_list, 3, 3) assert my_list == [1, 2, 3, 4, 5] assert my_list_backup is my_list assert r == [1, 2, 3, 4, 5] del list_1, list_2, list_3, r # ### Задача 3. (2 балла.) # Написать функцию `swap_columns(table, i, j)`, принимающую на вход таблицу `table` в виде списка списков, записанную по строчкам (то есть каждым элементом списка `table` является список, задающий строку таблицы) и два индекса `i` и `j`. Функция должна поменять в таблице местами столбец `i` и столбец `j` (нумерация столбцов начинается с нуля). Замена должна производиться в самой переданной таблице `table`. Функция не должна ничего возвращать. # In[ ]: # YOUR CODE HERE # In[ ]: table = [[1, 2, 3], [4, 5, 6]] r = swap_columns(table, 0, 1) assert r is None assert table == [[2, 1, 3], [5, 4, 6]] table = [[1, 2, 3], [4, 5, 6]] r = swap_columns(table, 1, 0) assert r is None assert table == [[2, 1, 3], [5, 4, 6]] table = [[1, 2, 3], [4, 5, 6]] r = swap_columns(table, 1, 2) assert r is None assert table == [[1, 3, 2], [4, 6, 5]] table = [[1, 2, 3], [4, 5, 6]] r = swap_columns(table, 2, 1) assert r is None assert table == [[1, 3, 2], [4, 6, 5]] table = [['a', 'b', 'cd', 'e']] r = swap_columns(table, 2, 1) assert r is None assert table == [['a', 'cd', 'b', 'e']] table = [[1], [2], [3], [4]] r = swap_columns(table, 0, 0) assert r is None assert table == [[1], [2], [3], [4]] # ### Задача 4. (2 балла.) # Написать функцию `swapped_columns(table, i, j)`, принимающую на вход таблицу `table` в виде списка списков, записанную по строчкам (то есть каждым элементом списка `table` является список, задающий строку таблицы) и два индекса `i` и `j`. Функция должна должна вернуть новую таблицу, совпадающую с `table`, но в которой столбцы `i` и `j` поменялись местами. Исходная таблица `table` не должна измениться (в частности, не должно измениться содержимое её строк). Можно использовать функции, написанные в предыдущих задачах. (Кстати, задача решается в одну строчку.) # In[ ]: # YOUR CODE HERE # In[ ]: table = [[1, 2, 3], [4, 5, 6]] backup = table[0] r = swapped_columns(table, 0, 1) assert table == [[1, 2, 3], [4, 5, 6]] assert table[0] is backup assert r == [[2, 1, 3], [5, 4, 6]] table = [[1, 2, 3], [4, 5, 6]] r = swapped_columns(table, 1, 0) assert table == [[1, 2, 3], [4, 5, 6]] assert r == [[2, 1, 3], [5, 4, 6]] table = [[1, 2, 3], [4, 5, 6]] r = swapped_columns(table, 1, 2) assert table == [[1, 2, 3], [4, 5, 6]] assert r == [[1, 3, 2], [4, 6, 5]] table = [[1, 2, 3], [4, 5, 6]] r = swapped_columns(table, 2, 1) assert table == [[1, 2, 3], [4, 5, 6]] assert r == [[1, 3, 2], [4, 6, 5]] table = [['a', 'b', 'cd', 'e']] r = swapped_columns(table, 2, 1) assert table == [['a', 'b', 'cd', 'e']] assert r == [['a', 'cd', 'b', 'e']] table = [[1], [2], [3], [4]] r = swapped_columns(table, 0, 0) assert table == [[1], [2], [3], [4]] assert r == [[1], [2], [3], [4]] # ### Задача 5. (1 балл) # Написать функцию `count_different_words(s)`, принимающую на вход строку `s` и вычисляющую, сколько в ней различных слов. Слова в строке `s` разделены пробелами, знаков препинания нет. Слова считаются разными, если различаются как строки, то есть слова `"hello"` и `"Hello"` — разные. # # **Подсказка:** с помощью множеств задача решается в одну строчку. # In[ ]: # YOUR CODE HERE # In[ ]: assert count_different_words("Hello") == 1 assert count_different_words("Hello World") == 2 assert count_different_words("Hello Hello") == 1 assert count_different_words("Hello World Hello") == 2 assert count_different_words("World Hello World World") == 2 assert count_different_words("a b c d e f g a b a b f g h") == 8 assert count_different_words("A B c d e f g a b a b f g h A B") == 10 # ### Задача 6. (1 балл.) # Написать функцию `censored_test()`, считывающую файл `test.txt` и печатающую его на экран, заменив все вхождения слова `haha` на `[censored]`. Файл `test.txt` должен быть явно закрыт перед выходом из функции! # # Пример: # # Если в файле test.txt записано # # haha test # another haha haha test # hahahaha hahahaha # this is a test # well # # то функция должна напечатать # # [censored] test # another [censored] [censored] test # [censored][censored] [censored][censored] # this is a test # well # # # # In[ ]: # YOUR CODE HERE # In[ ]: # Very long and esoteric test import io test_txt = io.StringIO() stdout = io.StringIO() def get_test_txt(): return test_txt def get_stdout(): return stdout def open(file, mode = 'r', *args, **kwargs): if file == 'test.txt' and mode in ['r', 'rt']: return get_test_txt() else: raise NotImplementedError def print(*args, file = None, **kwargs): if file is None: return __builtins__.print(*args, file=get_stdout(), **kwargs) else: raise NotImplementedError def myassert(q): global open global print if not q: del open del print assert q def test_censored(inp, outp): global test_txt global stdout test_txt = io.StringIO(inp) stdout = io.StringIO() censored_test() myassert(stdout.getvalue().strip() == outp.strip()) myassert(test_txt.closed) test_censored( "haha test\nanother haha haha test\nhahahaha hahahaha\nthis is a test\nwell", ("[censored] test\nanother [censored] [censored] test\n" "[censored][censored] [censored][censored]\nthis is a test\nwell") ) test_censored( ( "this is a haha haha haha\n" "haha ha ha hahahahahaha ha haha\n" "\n" "ha\n" "ha\n" "\n" "thisisahahahathis\n" "well...\n" "\n" "Hello, world!\n" ), ( "this is a [censored] [censored] [censored]\n" "[censored] ha ha [censored][censored][censored] ha [censored]\n" "\n" "ha\n" "ha\n" "\n" "thisisa[censored]hathis\n" "well...\n" "\n" "Hello, world!\n" ) ) del print del open