{ "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", "задач, про которые сказано обратное) \n", "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Домашнее задание №5\n", "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 12 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 12 баллов, чтобы подстраховаться.\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)) и вставить решение каждой задачи в ячейку для кода, следующую за его условием (вместо комментария `# YOUR CODE HERE`), запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и задачу нужно решить заново.\n", "\n", "**Внимание!** Нельзя создавать новые ячейки или как-либо менять notebook, кроме вставки решений!\n", "\n", "Чтобы сдать ДЗ, его надо будет загрузить на сервер в виде `ipynb`-файла. Куда загрузить — мы скажем дополнительно чуть позже." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача A. (1 балл.)\n", "Написать функцию `Dan_5(grades)`, принимающую на вход словарь `grades`, добавляющую в него запись с ключом `\"Dan\"` и значением `5` и возвращающую этот словарь." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "efa9c8f6ffa98b9a694b19866bf4618c", "grade": false, "grade_id": "prA", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "f6498eb41f772583f200e01b861525dc", "grade": true, "grade_id": "prA_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert Dan_5({})=={'Dan':5}\n", "assert Dan_5({'Dan':3})=={'Dan':5}\n", "assert Dan_5({'Alice':2})['Dan']==5\n", "assert Dan_5({1:2,3:4,'Dan':'Dan',5:'Dan'})['Dan']==5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача B. (1 балл.)\n", "Написать функцию `Dan_plus_1(grades)`, которая принимает на вход словарь `grades`, после чего меняет его следующим образом. Если в этом словаре имеется запись с ключом `\"Dan\"`, то её значение должно быть увеличено на 1. Если такой записи нет, она должна быть создана и ей должно быть присвоено значение 1. Функция должна вернуть получающийся словарь. Гаранируется, что в словаре `grades` все ключи являются строками, а все значения — целыми числами (проверять это не нужно)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "198a2be0a9cfbc88e194c0a29e747c93", "grade": false, "grade_id": "prB", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "bbdf8989939d4c4b2b3b5ba5870e31dd", "grade": true, "grade_id": "prB_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert Dan_plus_1({})=={'Dan':1}\n", "assert Dan_plus_1({'Dan':3})=={'Dan':4}\n", "assert Dan_plus_1({'Alice':4})=={'Alice':4,'Dan':1}\n", "assert Dan_plus_1({'Alice':4, 'Bob':3, 'Dan':5})=={'Alice':4, 'Bob':3, 'Dan':6}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача C. (1 балл.)\n", "Написать функцию `are_there_more_4(grades)`, проверяющую, есть ли среди *значений* словаря `grades` хоть одно число больше 4. Функция должна возвращать `True`, если такое значение есть, и `False` в противном случае. Гарантируется, что значениями словаря являются только числа." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "d5873d6b88bb361cc3007322819f8bfe", "grade": false, "grade_id": "prC", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "0bf7f9b204a83989c7e0626de514cafe", "grade": true, "grade_id": "prC_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert are_there_more_4({1:2,3:3})==False\n", "assert are_there_more_4({5:3, 2:3, 4:1})==False\n", "assert are_there_more_4({6:5})==True\n", "assert are_there_more_4({})==False\n", "assert are_there_more_4({'Alice':3, 'Bob':4})==False\n", "assert are_there_more_4({'Alice':4, 'Bob':5, \"Dan\":3})==True\n", "assert are_there_more_4({6:8})==True\n", "assert are_there_more_4({'Alice':4, 'Bob':9, \"Dan\":3})==True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача D. (1 балл.)\n", "Написать функцию `append_sum(str_floats)` принимающую на вход список `str_floats`, состоящий из строк, в которых записаны некоторые вещественные числа (с плавающей запятой), и создающую новый список со следующими свойствами: \n", "\n", "1. Все элементы нового списка получаются из элементов старого преобразованием к типу «число с плавающей точкой». \n", "2. В конец списка добавляется ещё один элемент, равный сумме всех других элементов.\n", "\n", "После этого новый список возвращается функцией.\n", "\n", "Пример: для списка `[\"0.125\",\"0.5\"]` должен быть возвращён список `[0.125, 0.5, 0.625]`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "8a0e44d11c8e69891dba0826117ce758", "grade": false, "grade_id": "prD", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "4365724916b277c44f0e00bf72f6194d", "grade": true, "grade_id": "prD_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "def assert_eq(x,y):\n", " for _x, _y in zip(x,y):\n", " assert(abs(_x-_y)<1E-15)\n", "assert_eq(append_sum([\"0.125\",\"0.5\"]),[0.125, 0.5, 0.625])\n", "assert_eq(append_sum([\"0\"]),[0,0])\n", "assert_eq(append_sum([\"1\",\"-2\"]),[1,-2,-1])\n", "assert_eq(append_sum([\"0.1234567\",\"0.111111\",\"0.1231241243\", \"12.12312314\"]), \n", " [0.1234567, 0.111111, 0.1231241243, 12.12312314, 12.4808149643])\n", "del assert_eq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача E. (1 балл.)\n", "Написать функцию `flatten_dict(d)`, принимающую на вход словарь `d` и возвращающую список, в который записаны последовательно ключи и значения словаря `d` (порядок следования ключей не важен, но после каждого ключа должно идти значение, которое ему соответствует). Например, `flatten_dict({'Alice':1, 'Bob':2})` может вернуть список `['Alice', 1, 'Bob', 2]` или список `['Bob', 2, 'Alice', 1]`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "d1cea7c070981653109ae252f6b8fc93", "grade": false, "grade_id": "prE", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "f451508e0c2900c3f50ac51e36766ac7", "grade": true, "grade_id": "prE_1", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "def checkdict(d):\n", " l = flatten_dict(d)\n", " assert set(l[::2])==set(d.keys())\n", " for i in range(0,len(l),2):\n", " assert d[l[i]]==l[i+1]\n", "checkdict({})\n", "checkdict({'Alice':1, 'Bob':2})\n", "checkdict({'Alice':1})\n", "checkdict({2:1, 3:1, 4:1})\n", "checkdict({'Alice':'Bob', 1:2, 'Jein':'Bob'})\n", "del checkdict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача F. (1 балл.)\n", "Написать функцию `countlen(words)`, принимающую на вход список строк, а возвращающую словарь, ключами которого являются строки из списка `words`, а значениями — их длины (в символах). Например, `countlen(['hello', 'world!'])` возвращает словарь `{'hello':5, 'world!':6}`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "9e37a6c587ab8410c20e3cf9351817de", "grade": false, "grade_id": "prF", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "f9f9a21fcabbe966bdaa0e859b3bf2c9", "grade": true, "grade_id": "prF_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert countlen(['Alice'])=={'Alice':5}\n", "assert countlen([])=={}\n", "assert countlen(['this', 'is', 'a', 'table'])=={'this':4, 'is':2, 'a':1, 'table': 5}\n", "assert countlen(['z'*100])=={'z'*100:100}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача G. (2 балла)\n", "Написать функцию `translate(s,D)`, принимающую на вход строку `s`, состоящую из слов, разделенных пробелами (любые два соседние слова разделены ровно одним пробелом), и словарь D, ключами которого являются слова и значениями тоже слова. Считая, что словарь `D` задаёт правила перевода слов с одного языка на другой, перевести строчку s пословно. Слова, которых нет в словаре, не менять. Пример: пусть\n", "\n", " s = \"hello this is a test hello\"\n", " D = {\"hello\":\"privet\",\"this\":\"eto\",\"test\":\"proverka\"}\n", "\n", "тогда `translate(s,D)` должна вернуть строчку `\"privet eto is a proverka privet\"`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "a0b72ba1274d94fdfe4135923dd7b87e", "grade": false, "grade_id": "prG", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "410234e3408aaa936de724dac513cc91", "grade": true, "grade_id": "prG_t", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "assert translate(\"hello this is a test hello\", {\"hello\":\"privet\",\"this\":\"eto\",\"test\":\"proverka\"}) == \"privet eto is a proverka privet\"\n", "assert translate(\"this is is this\", {\"this\":\"is\", \"is\":\"this\"})==\"is this this is\"\n", "assert translate(\"Well done, well done\", {\"well\": \"nice\"}) == \"Well done, nice done\"\n", "assert translate(\"Okay let us test you\", {}) == \"Okay let us test you\"\n", "assert translate(\"\",{\"this\":\"is\"}) == \"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача H. (2 балла)\n", "Написать функцию `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]]`." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "9f3a1f3928b131d26ab61b7d458cd578", "grade": false, "grade_id": "pr_H", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "assert transpose([[1, 2, 3], [4, 5, 6], [7, 8, 9]])==[[1,4,7],[2,5,8],[3,6,9]]\n", "assert transpose([[1, 2, 3, 4]])==[[1], [2], [3], [4]]\n", "assert transpose([[1,2,3,4], [5,6,7,8]])==[[1,5],[2,6], [3,7], [4,8]]\n", "\n", "def check_idemp(t):\n", " assert transpose(transpose(t))==t\n", "\n", "check_idemp([[1,2],['Hello', 'World']])\n", "check_idemp([[1]*100, [2]*100, [3]*100])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача J. (2 балла.)\n", "Источник: [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", "\n", "Как известно, в США президент выбирается не прямым голосованием, а путем двухуровневого голосования. Сначала проводятся выборы в каждом штате и определяется победитель выборов в данном штате. Затем проводятся государственные выборы: на этих выборах каждый штат имеет определенное число голосов — число выборщиков от этого штата. На практике, все выборщики от штата голосуют в соответствии с результами голосования внутри штата, то есть на заключительной стадии выборов в голосовании участвуют штаты, каждый из которых имеет своё число голосов.\n", "\n", "Напишите функцию `elections()`, принимающую на вход несколько кортежей, в каждом из которых два элемента: первый элемент это фамилия кандидата, а второй — число голосов, отданных за него в каком-то из штатов. Подведите итоги выборов: верните словарь, ключами которого будут фамилии кандидатов, а значениями — общее число голосов (выборщиков), которое они получили на этих выборах." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "6de6c990d4c83d8944310c168c1610e9", "grade": false, "grade_id": "prJ", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "1d1dc81a61ced78886eb9875dd363d9d", "grade": true, "grade_id": "prJ_t", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "def check_elections(i, o):\n", " args = [(c,int(v)) for c,v in (s.split() for s in i.splitlines())]\n", " out = dict((c,int(v)) for c,v in (s.split() for s in o.splitlines()))\n", " assert elections(*args)==out\n", " \n", "assert elections( ('McCain', 10),('McCain', 5),('Obama', 9), ('Obama', 8), ('McCain', 1) )=={'McCain': 16, 'Obama': 17}\n", "check_elections(\"\"\"McCain 10\n", "McCain 3\n", "Obama 19\n", "Obama 2\n", "McCain 7\n", "McCain 2\n", "Obama 6\n", "Obama 10\n", "McCain 11\n", "McCain 5\n", "Obama 3\n", "Obama 12\n", "McCain 13\"\"\",\"\"\"McCain 51\n", "Obama 52\"\"\")\n", "check_elections(\"\"\"Obama 1\"\"\", \"\"\"Obama 1\"\"\")\n", "check_elections(\"\"\"ivan 2\n", "gena 1\n", "sergey 100000\n", "ivan 1\n", "ivan 1\n", "ivan 0\n", "gena 100\"\"\", \"\"\"gena 101\n", "ivan 4\n", "sergey 100000\"\"\")\n", "check_elections(\"Obama 1\\n\"*60+\"McCain 59\", \"Obama 60\\nMcCain 59\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача K. (3 балла.)\n", "Напишите функцию `stats(s)`, принимающую на вход строку `s`, содержащую слова, разделённые пробелами или переводами строки, и находящую самое часто встречающееся слово. Если такое слово одно, верните его, если их несколько, верните список, в котором они перечислены все (в любом порядке). Использовать внешние библиотеки нельзя!\n", "\n", "Например: `stats(\"hello hello world\")` должна вернуть строчку `\"hello\"`, а `stats(\"a a b b c\")` должна вернуть список `['a','b']` или `['b','a']`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "02f383c98c7e861457816bce65312683", "grade": false, "grade_id": "prK", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "e50825c4ef382ae5bb420ac32ab5e12f", "grade": true, "grade_id": "prK_t", "locked": true, "points": 3, "solution": false } }, "outputs": [], "source": [ "def checkstats(i, o):\n", " if len(o)>1:\n", " assert set(stats(i))==set(o)\n", " else:\n", " assert stats(i)==o\n", " \n", "checkstats(\"apple orange banana banana orange\",['banana', 'orange'])\n", "checkstats(\"\"\"q w e r t y u i o p\n", "a s d f g h j k l\n", "z x c v b n m\"\"\", \n", " ['b', 'm', 'p', 'z', 'u', 'j', 't', 'e', 'w', 'g', 's', 'k', 'v', 'f', 'r', \n", " 'c', 'x', 'a', 'n', 'y', 'l', 'i', 'q', 'h', 'd', 'o'])\n", "checkstats(\"\"\"vqcg vqcg vqcg vqcg vqcg vqcg vqcg\n", "vqcg vqcg\n", "vqcg\n", "\"\"\", 'vqcg')\n", "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", "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", "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", "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", "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", "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", "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", "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", "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", "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", "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'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача L. (3 балла.) \n", "Источник: [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", "\n", "Вам предостоит обработать базу данных о продажах некоторого интернет-магазина. База данных представляет собой набор кортежей, в каждом кортеже три элемента: `(Покупатель, товар, количество)`, где `Покупатель` — имя покупателя (строка без пробелов), `товар` — название товара (строка без пробелов), `количество` — количество приобретенных единиц товара.\n", "\n", "Создайте словарь, ключами которого являются имена покупателей, а значениями — словари, ключами которых являются названия товаров, а значениями — количество единиц этого товара, которые купил этот покупатель.\n", "\n", "Напишите функцию `aggregate(*args)`, принимающую некоторое количество набор кортежей из базы данных и возвращающую сводную информацию в виде словаря, как указано выше.\n", "\n", "Примеры см. в тесте." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "9c380a287fdb023b6e15f2f4b4e9a0fb", "grade": false, "grade_id": "prL", "locked": false, "solution": true } }, "outputs": [], "source": [ "# YOUR CODE HERE" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "9f1959eb6cc616575b48486436a67c38", "grade": true, "grade_id": "prL_t", "locked": true, "points": 3, "solution": false } }, "outputs": [], "source": [ "assert aggregate((\"Ivanov\",\"paper\",10), \n", "(\"Petrov\",\"pens\",5), \n", "(\"Ivanov\",\"marker\",3), \n", "(\"Ivanov\",\"paper\",7), \n", "(\"Petrov\",\"envelope\",20), \n", "(\"Ivanov\",\"envelope\",5))=={'Ivanov': {'envelope': 5, 'marker': 3, 'paper': 17},\n", " 'Petrov': {'envelope': 20, 'pens': 5}}\n", "assert aggregate((\"Ivanov\",\"aaa\",1), \n", "(\"Petrov\",\"aaa\",2), \n", "(\"Sidorov\",\"aaa\",3), \n", "(\"Ivanov\",\"aaa\",6), \n", "(\"Petrov\",\"aaa\",7), \n", "(\"Sidorov\",\"aaa\",8), \n", "(\"Ivanov\",\"bbb\",3), \n", "(\"Petrov\",\"bbb\",7), \n", "(\"Sidorov\",\"aaa\",345), \n", "(\"Ivanov\",\"ccc\",45), \n", "(\"Petrov\",\"ddd\",34), \n", "(\"Ziborov\",\"eee\",234), \n", "(\"Ivanov\",\"aaa\",45))=={'Ivanov': {'aaa': 52, 'bbb': 3, 'ccc': 45},\n", " 'Petrov': {'aaa': 9, 'bbb': 7, 'ddd': 34},\n", " 'Sidorov': {'aaa': 356},\n", " 'Ziborov': {'eee': 234}}\n", "assert aggregate((\"TKSNUU\",\"FKXYPUGQ\",855146), \n", "(\"TKSNUU\",\"FKXYPUGQ\",930060), \n", "(\"TKSNUU\",\"FKXYPUGQ\",886973), \n", "(\"TKSNUU\",\"FKXYPUGQ\",59344), \n", "(\"TKSNUU\",\"FKXYPUGQ\",296343), \n", "(\"TKSNUU\",\"FKXYPUGQ\",193166), \n", "(\"TKSNUU\",\"FKXYPUGQ\",211696), \n", "(\"TKSNUU\",\"FKXYPUGQ\",821064), \n", "(\"TKSNUU\",\"FKXYPUGQ\",672846), \n", "(\"TKSNUU\",\"FKXYPUGQ\",820341), \n", "(\"TKSNUU\",\"FKXYPUGQ\",350693), \n", "(\"TKSNUU\",\"FKXYPUGQ\",469538), \n", "(\"TKSNUU\",\"FKXYPUGQ\",849069), \n", "(\"TKSNUU\",\"FKXYPUGQ\",502007), \n", "(\"TKSNUU\",\"FKXYPUGQ\",961595), \n", "(\"TKSNUU\",\"FKXYPUGQ\",747271), \n", "(\"TKSNUU\",\"FKXYPUGQ\",863648), \n", "(\"TKSNUU\",\"FKXYPUGQ\",952069), \n", "(\"TKSNUU\",\"FKXYPUGQ\",286019), \n", "(\"TKSNUU\",\"FKXYPUGQ\",364841), \n", "(\"TKSNUU\",\"FKXYPUGQ\",455930), \n", "(\"TKSNUU\",\"FKXYPUGQ\",100486), \n", "(\"TKSNUU\",\"FKXYPUGQ\",335026), \n", "(\"TKSNUU\",\"FKXYPUGQ\",197672), \n", "(\"TKSNUU\",\"FKXYPUGQ\",217640), \n", "(\"TKSNUU\",\"FKXYPUGQ\",612549), \n", "(\"TKSNUU\",\"FKXYPUGQ\",622501), \n", "(\"TKSNUU\",\"FKXYPUGQ\",96554), \n", "(\"TKSNUU\",\"FKXYPUGQ\",327166), \n", "(\"TKSNUU\",\"FKXYPUGQ\",425399), \n", "(\"TKSNUU\",\"FKXYPUGQ\",362309), \n", "(\"TKSNUU\",\"FKXYPUGQ\",78477), \n", "(\"TKSNUU\",\"FKXYPUGQ\",258916), \n", "(\"TKSNUU\",\"FKXYPUGQ\",297923), \n", "(\"TKSNUU\",\"FKXYPUGQ\",8891), \n", "(\"TKSNUU\",\"FKXYPUGQ\",13639), \n", "(\"TKSNUU\",\"FKXYPUGQ\",77308), \n", "(\"TKSNUU\",\"FKXYPUGQ\",707620), \n", "(\"TKSNUU\",\"FKXYPUGQ\",68205), \n", "(\"TKSNUU\",\"FKXYPUGQ\",256702), \n", "(\"TKSNUU\",\"FKXYPUGQ\",668334), \n", "(\"TKSNUU\",\"FKXYPUGQ\",968673), \n", "(\"TKSNUU\",\"FKXYPUGQ\",138125), \n", "(\"TKSNUU\",\"FKXYPUGQ\",222904), \n", "(\"TKSNUU\",\"FKXYPUGQ\",214091), \n", "(\"TKSNUU\",\"FKXYPUGQ\",500231), \n", "(\"TKSNUU\",\"FKXYPUGQ\",19611), \n", "(\"TKSNUU\",\"FKXYPUGQ\",491343), \n", "(\"TKSNUU\",\"FKXYPUGQ\",404307), \n", "(\"TKSNUU\",\"FKXYPUGQ\",68367), \n", "(\"TKSNUU\",\"FKXYPUGQ\",287107), \n", "(\"TKSNUU\",\"FKXYPUGQ\",794935), \n", "(\"TKSNUU\",\"FKXYPUGQ\",254217), \n", "(\"TKSNUU\",\"FKXYPUGQ\",206370), \n", "(\"TKSNUU\",\"FKXYPUGQ\",202761), \n", "(\"TKSNUU\",\"FKXYPUGQ\",929017), \n", "(\"TKSNUU\",\"FKXYPUGQ\",843359), \n", "(\"TKSNUU\",\"FKXYPUGQ\",955269), \n", "(\"TKSNUU\",\"FKXYPUGQ\",134139), \n", "(\"TKSNUU\",\"FKXYPUGQ\",946168), \n", "(\"TKSNUU\",\"FKXYPUGQ\",967781), \n", "(\"TKSNUU\",\"FKXYPUGQ\",856474), \n", "(\"TKSNUU\",\"FKXYPUGQ\",465070), \n", "(\"TKSNUU\",\"FKXYPUGQ\",580526), \n", "(\"TKSNUU\",\"FKXYPUGQ\",172109), \n", "(\"TKSNUU\",\"FKXYPUGQ\",191703), \n", "(\"TKSNUU\",\"FKXYPUGQ\",207916), \n", "(\"TKSNUU\",\"FKXYPUGQ\",512264), \n", "(\"TKSNUU\",\"FKXYPUGQ\",533081), \n", "(\"TKSNUU\",\"FKXYPUGQ\",577208), \n", "(\"TKSNUU\",\"FKXYPUGQ\",831389), \n", "(\"TKSNUU\",\"FKXYPUGQ\",439158), \n", "(\"TKSNUU\",\"FKXYPUGQ\",565633), \n", "(\"TKSNUU\",\"FKXYPUGQ\",452643), \n", "(\"TKSNUU\",\"FKXYPUGQ\",164426), \n", "(\"TKSNUU\",\"FKXYPUGQ\",540743), \n", "(\"TKSNUU\",\"FKXYPUGQ\",880704), \n", "(\"TKSNUU\",\"FKXYPUGQ\",868529), \n", "(\"TKSNUU\",\"FKXYPUGQ\",240742), \n", "(\"TKSNUU\",\"FKXYPUGQ\",868865), \n", "(\"TKSNUU\",\"FKXYPUGQ\",910442), \n", "(\"TKSNUU\",\"FKXYPUGQ\",146737), \n", "(\"TKSNUU\",\"FKXYPUGQ\",820984), \n", "(\"TKSNUU\",\"FKXYPUGQ\",660948), \n", "(\"TKSNUU\",\"FKXYPUGQ\",957975), \n", "(\"TKSNUU\",\"FKXYPUGQ\",135847), \n", "(\"TKSNUU\",\"FKXYPUGQ\",401865), \n", "(\"TKSNUU\",\"FKXYPUGQ\",982859), \n", "(\"TKSNUU\",\"FKXYPUGQ\",748454), \n", "(\"TKSNUU\",\"FKXYPUGQ\",354734), \n", "(\"TKSNUU\",\"FKXYPUGQ\",525638), \n", "(\"TKSNUU\",\"FKXYPUGQ\",119140), \n", "(\"TKSNUU\",\"FKXYPUGQ\",484816), \n", "(\"TKSNUU\",\"FKXYPUGQ\",616539), \n", "(\"TKSNUU\",\"FKXYPUGQ\",682553), \n", "(\"TKSNUU\",\"FKXYPUGQ\",841541), \n", "(\"TKSNUU\",\"FKXYPUGQ\",713063), \n", "(\"TKSNUU\",\"FKXYPUGQ\",433453), \n", "(\"TKSNUU\",\"FKXYPUGQ\",465340), \n", "(\"TKSNUU\",\"FKXYPUGQ\",985635))=={'TKSNUU': {'FKXYPUGQ': 49769497}}\n", "assert aggregate()=={}" ] } ], "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 }