Программирование

И. В. Щуров, НИУ ВШЭ

Данный notebook является набором задач по курсу «Программирование» (Магистерская программа «Журналистика данных», НИУ ВШЭ, 2018-19).

На странице курса находятся другие материалы.

Домашнее задание №5

За разные задачи можно получить разное число баллов. Если не указано обратное, задача весит 1 балл. Максимум за ДЗ можно набрать 10 баллов. Вы можете решить больше задач, чем требуется, чтобы потренироваться или подстраховаться.

Чтобы сдать ДЗ, его надо загрузить в nbgr-x в виде ipynb-файла. Получить ipynb-файл можно, выбрав в Jupyter пункт меню File → Download as... → IPython Notebook (.ipynb).

Задача 1 (1 балл)

Написать функцию Dan_5(grades), принимающую на вход словарь grades, добавляющую в него запись с ключом "Dan" и значением 5 и возвращающую этот словарь.

В этой задаче не нужны циклы и оператор if.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert Dan_5({})=={'Dan':5}
assert Dan_5({'Dan':3})=={'Dan':5}
assert Dan_5({'Alice':2}) == {'Alice': 2, 'Dan': 5}
assert Dan_5({1: 2, 3: 4, 'Dan': 'Dan', 5: 'Dan'})['Dan'] == 5

Задача 2 (1 балл)

Написать функцию len_of_translation(dictionary, word), принимающую на вход словарь dictionary и строку word. В словаре ключами являются слова на английском, а значениями — перевод этих слов на клингонский. Функция должна для данного слова word на английском вернуть число символов в его переводе на клингонский.

Подсказка. Чтобы узнать число символов в строке, нужно использовать функцию len. Для выполнения этой задачи не нужно знать клингонский, не нужно использовать циклы и оператор if.

In [ ]:
# YOUR CODE HERE
In [ ]:
dictionary = {'hello': 'nuqneH',
              'country': 'Hatlh',
              'plate': "jengva'",
              'pencil': "ghojmoH ghItlhwI'",
              'pen': "ghItlhwI'"}
assert len_of_translation(dictionary, "hello") == 6
assert len_of_translation(dictionary, "country") == 5
assert len_of_translation(dictionary, "plate") == 7
assert len_of_translation(dictionary, "pencil") == 17
assert len_of_translation(dictionary, "pen") == 9
dictionary['hello'] = 'a'
assert len_of_translation(dictionary, "hello") == 1

Задача 3 (1 балл)

Напишите функцию get_country_code(country), принимающую на вход название страны и возвращающую её телефонный код в виде строки, начинающейся со знака "+". Она должна уметь обрабатывать следующие страны: "Russia", "France", "Germany", "Spain", "Malta".

В функции не должно быть операторов if и циклов.

Подсказка. Создайте словарь, в котором ключами будут страны, а значениями — коды. Правильные ответы см. в тестовой ячейке.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert get_country_code("Russia") == "+7"
assert get_country_code("France") == "+33"
assert get_country_code("Germany") == "+49"
assert get_country_code("Spain") == "+34"
assert get_country_code("Malta") == "+356"

Задача 4 (1 балл)

Написать функцию what_about_Dan(grades), которая принимает на вход словарь grades, после чего возвращает строку, в зависимости от значения записи с ключом "Dan". Если такой записи нет, функция должна вернуть строку "Don't know Dan". Если такая запись есть и её значением является число, большее 3, функция должна вернуть строку "Dan is fine". Если такая запись есть и её значением является чило, меньшее или равное 3, то функция должна вернуть строку "Dan needs help".

Подсказка. Вы можете проверить, существует ли в словаре запись с данным ключом, с помощью оператора in. Например, для словаря my_dict = {'alpha': 1, 'beta': 2}, проверка 'alpha' in my_dict вернёт True, а 'gamma' in my_dict вернёт False. Также можно использовать оператор not in: 'gamma' not in my_dict вернёт True.

In [ ]:
my_dict = {'alpha': 1, 'beta': 2}
if 'alpha' in my_dict:
    print('alpha is here')
In [ ]:
if 'gamma' not in my_dict:
    print("gamma is not here")
In [ ]:
# YOUR CODE HERE
In [ ]:
assert what_about_Dan({}) == "Don't know Dan"
assert what_about_Dan({"Dan": 1}) == "Dan needs help"
assert what_about_Dan({"Dan": 5}) == "Dan is fine"
assert what_about_Dan({"Dan": 1, 'Claudia': 3}) == "Dan needs help"
assert what_about_Dan({"Dan": 5, 'Claudia': 5}) == "Dan is fine"
assert what_about_Dan({"Dan": 1, 'Alice': 3, 'Claudia': 8}) == \
                      "Dan needs help"
assert what_about_Dan({"Dan": 5, 'Alice': 4, 'Claudia': 9}) == "Dan is fine"
assert what_about_Dan({'Claudia': 3}) == "Don't know Dan"

Задача 5 (1 балл)

Написать функцию Dan_plus_1(grades), которая принимает на вход словарь grades, после чего меняет его следующим образом. Если в этом словаре имеется запись с ключом "Dan", то её значение должно быть увеличено на 1. Если такой записи нет, она должна быть создана и ей должно быть присвоено значение 1. Функция должна вернуть получающийся словарь. Гаранируется, что в словаре grades все ключи являются строками, а все значения — целыми числами (проверять это не нужно).

In [ ]:
# YOUR CODE HERE
In [ ]:
assert Dan_plus_1({}) == {'Dan': 1}
assert Dan_plus_1({'Dan': 3}) == {'Dan': 4}
assert Dan_plus_1({'Alice': 4})=={'Alice': 4,'Dan': 1}
assert Dan_plus_1({'Alice': 4, 'Bob': 3, 'Dan': 5}) == {'Alice': 4, 'Bob': 3, 'Dan': 6}

Задача 6 (1 балл)

Написать функцию are_there_more_4(grades), проверяющую, есть ли среди значений словаря grades хоть одно число больше 4. Функция должна возвращать True, если такое значение есть, и False в противном случае. Гарантируется, что в словаре есть хотя бы одна запись и значениями словаря являются только числа.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert are_there_more_4({1: 2,3: 3}) is False
assert are_there_more_4({5: 3, 2: 3, 4: 1}) is False
assert are_there_more_4({6: 5}) is True
assert are_there_more_4({'Alice': 3, 'Bob': 4}) is False
assert are_there_more_4({'Alice': 4, 'Bob': 5, "Dan": 3}) is True
assert are_there_more_4({6: 8}) is True
assert are_there_more_4({'Alice': 4, 'Bob': 9, "Dan": 3}) is True

Задача 7 (2 балла)

Написать функцию flatten_dict(d), принимающую на вход словарь d и возвращающую список, в который записаны последовательно ключи и значения словаря d. Например, flatten_dict({'Alice': 1, 'Bob': 2}) должна вернуть список ['Alice', 1, 'Bob', 2].

In [ ]:
# YOUR CODE HERE
In [ ]:
def checkdict(d):
    l = flatten_dict(d)
    assert set(l[::2])==set(d.keys())
    for i in range(0,len(l),2):
        assert d[l[i]]==l[i+1]
checkdict({})
checkdict({'Alice': 1, 'Bob': 2})
checkdict({'Alice': 1})
checkdict({2: 1, 3: 1, 4: 1})
checkdict({'Alice': 'Bob', 1: 2, 'Jein': 'Bob'})
del checkdict

Задача 8 (2 балла)

Написать функцию countlen(words), принимающую на вход список строк, а возвращающую словарь, ключами которого являются строки из списка words, а значениями — их длины (в символах). Например, countlen(['hello', 'world!']) возвращает словарь {'hello': 5, 'world!': 6}.

Подсказка. Чтобы создать пустой словарь, можно использовать пустые фигурные скобки {}.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert countlen(['Alice'])=={'Alice':5}
assert countlen([])=={}
assert countlen(['this', 'is', 'a', 'table'])=={'this':4, 'is':2, 'a':1, 'table': 5}
assert countlen(['z'*100])=={'z'*100:100}

Задача 9 (2 балла)

Написать функцию sum_good_numbers(numbers), принимающую на вход словарь, в котором ключами являются числами, а значениями — строки. Функция должна найти сумму всех чисел, являющихся ключами словаря, для которых значением является слово "good". Например, sum_good_numbers({1: 'good', 2: 'bad', 3: 'good'}) должна вернуть число 4.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert sum_good_numbers({1: 'good'}) == 1
assert sum_good_numbers({1: 'good', 2: 'bad'}) == 1
assert sum_good_numbers({1: 'good', 2: 'bad', 3: 'good'}) == 4
assert sum_good_numbers({1: 'good', 2: 'bad', 3: 'good', 4: 'dont'}) == 4
assert sum_good_numbers({1: 'bad', 2: 'bad', 3: 'good', 4: 'dont'}) == 3
assert sum_good_numbers({5: 'bad', 3: 'good', 1: 'good', 4: 'dont'}) == 4
assert sum_good_numbers({5: 'bad', 13: 'good', 1: 'good', 4: 'dont', 
                         15: 'good'}) == 29

Задача 10 (4 балла)

Напишите функцию stats(words), принимающую на вход список строк и возвращающую самое часто встречающееся слово. Если таких слов несколько, следует вернуть то из них, которое в списке встречается первым.

Например, stats(["qqq", "hello", "hello", "world"]) должна вернуть строчку "hello", а stats(["qqq", "a", "b", "b", "a", "c"]) должна вернуть строку "a".

Подсказка. Казалось бы, причём здесь словари?

In [ ]:
# YOUR CODE HERE
In [ ]:
def checkstats(i, o):
    assert stats(i.split())==o
        
checkstats("apple orange banana banana orange", 'orange')
checkstats("""q w e r t y u i o p
a s d f g h j k l
z x c v b n m""", 'q')
checkstats("""vqcg vqcg vqcg vqcg vqcg vqcg vqcg
vqcg vqcg
vqcg
""", 'vqcg')
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.
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.
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.
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.
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.
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.
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.
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.
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.
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')
checkstats("enagtgufzhnmyzkf kaphgquvoanw tkvj sylaejugfsv vuszbsdsv kmyyed rnhcdrpx b ejqa vykiu fjmdqlgxmameddhiytv yy owmldhdcjnoi durqhg ftjnehww aq ou tqxlcnxdpnmo ssdhbcdzzp twjdcvcojgtj", 'enagtgufzhnmyzkf')