Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ
Данный notebook является набором задач по курсу «Программирование на языке Python для сбора и анализа данных» (НИУ ВШЭ, 2014-15). Распространяется по лицензии CC BY-SA 4.0. На странице курса находятся другие материалы.
За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 6 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 6 баллов, чтобы подстраховаться.
Для предварительной проверки задания нужно скачать данный ipynb
-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. здесь) и вставить решение каждой задачи в ячейку для кода, следующую за его условием, запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.
Чтобы сдать ДЗ, его надо будет загрузить в nbgr-x в виде ipynb
-файла.
Написать функцию swap(my_list)
, меняющую в списке my_list
первый и последний элемент местами. Измениться должен переданный список, функция не должна ничего возвращать. Гарантируется, что в списке есть хотя бы два элемента.
# YOUR CODE HERE
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
Написать функцию swapped(my_list, i, j)
, возвращающую такой же список, как my_list
, но у которого поменяли элемент с индексом i
и элемент с индексом j
местами. При этом сам список my_list
не должен измениться.
# YOUR CODE HERE
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
Написать функцию swap_columns(table, i, j)
, принимающую на вход таблицу table
в виде списка списков, записанную по строчкам (то есть каждым элементом списка table
является список, задающий строку таблицы) и два индекса i
и j
. Функция должна поменять в таблице местами столбец i
и столбец j
(нумерация столбцов начинается с нуля). Замена должна производиться в самой переданной таблице table
. Функция не должна ничего возвращать.
# YOUR CODE HERE
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]]
Написать функцию swapped_columns(table, i, j)
, принимающую на вход таблицу table
в виде списка списков, записанную по строчкам (то есть каждым элементом списка table
является список, задающий строку таблицы) и два индекса i
и j
. Функция должна должна вернуть новую таблицу, совпадающую с table
, но в которой столбцы i
и j
поменялись местами. Исходная таблица table
не должна измениться (в частности, не должно измениться содержимое её строк). Можно использовать функции, написанные в предыдущих задачах. (Кстати, задача решается в одну строчку.)
# YOUR CODE HERE
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]]
Написать функцию count_different_words(s)
, принимающую на вход строку s
и вычисляющую, сколько в ней различных слов. Слова в строке s
разделены пробелами, знаков препинания нет. Слова считаются разными, если различаются как строки, то есть слова "hello"
и "Hello"
— разные.
Подсказка: с помощью множеств задача решается в одну строчку.
# YOUR CODE HERE
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
Написать функцию 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
# YOUR CODE HERE
# 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