{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python для сбора данных\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*\n", "\n", "## Практикум 1: решения" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 1" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "girls = [\"Иветта\", \"Виолетта\", \"Кассандра\", \"Вирджиния\", \n", " \"Амелия\", \"Розамунда\", \"Янина\", \"Беатриса\"]" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Виолетта', 'Кассандра', 'Вирджиния', 'Амелия']\n", "['Вирджиния', 'Амелия', 'Розамунда', 'Янина', 'Беатриса']\n", "['Иветта', 'Виолетта', 'Вирджиния', 'Амелия']\n", "['Кассандра', 'Амелия', 'Розамунда']\n" ] } ], "source": [ "print(girls[1:5]) # 1\n", "print(girls[3:]) # 2\n", "print(girls[0:2] + girls[3:5]) # 3\n", "print(girls[2:3] + girls[4:6]) # 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Насчет последнего списка: его можно получить и иначе, но нужно иметь в виду, что выбор одного объекта без среза вернет не список, а отдельную строку, которую нельзя склеить со списком через `+`:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Кассандра'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "girls[2]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "must be str, not list", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mgirls\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mgirls\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: must be str, not list" ] } ], "source": [ "girls[2] + girls[4:6]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В таком случае потребуются дополнительные квадратные скобки (правда это уже будет не так изящно):" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Кассандра', 'Амелия', 'Розамунда']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[girls[2]] + girls[4:6]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Обратите внимание: срезы вида `L[k:k]` всегда пустые!" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "girls[2:2] # срез от 2-ого элемента по 2-ой элемент, не включая 2-ой" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 2" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "numbers = [1, 5, 6, 8, 10, 21, 25, 1, 0, -9, 9]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Введите целое число от 1 до 10: 3\n", "6\n" ] } ], "source": [ "k = int(input(\"Введите целое число от 1 до 10: \"))\n", "print(numbers[k - 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 3" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "3\n", "5\n", "7\n" ] } ], "source": [ "L = [1,2,3,4]\n", "\n", "for i in range(len(L)):\n", " a = L[i] + L[i-1]\n", " print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Разберем код на части. Что такое `range(len(L))`?" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 1, 2, 3]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(len(L))) # индексы элементов списка L" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Значит цикл for бегает по индексам списка `L`. Тогда `L[i]` – это i-тый элемент списка `L`, а `L[i-1]` – элемент, предшествующий i-тому элементу. Эти два элемента складываются, и результат сохраняется в `a`.\n", "\n", "Посмотрим. Если `i = 0`, то получаем `L[0]` и `L[-1]`. Значит, на первом шаге (на первой итерации) цикла мы складываем первый и последний элементы списка.\n", "\n", " 1 + 4 = 5\n", "\n", "Двигаемся дальше. Если `i = 1`, то получаем `L[1]` и `L[0]`. Значит, на втором шаге цикла мы складываем второй и первый элементы списка.\n", "\n", " 2 + 1 = 3\n", "\n", "И так далее.\n", "\n", "Почему этот код интересен? Потому, что он не ломается: Python не возражает против отрицательных индексов элементов, он просто начинает считать элементы с конца списка." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "income = [25000, 32000, 120000, 5000]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10.126631103850338, 10.373491181781864, 11.695247021764184, 8.517193191416238]\n" ] } ], "source": [ "import math\n", "log_income = []\n", "for i in income:\n", " log_income.append(math.log(i))\n", "print(log_income)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте заодно посмотрим на альтернативу циклам при создании списков – на списковые включения (*list comprehensions*). Они позволяют создавать новые списки на основе старых более компактным и быстрым образом, без явных циклов. Чтобы понять, как они работают, нужно прочитать код с циклом снизу вверх: сначала что делаем, а потом – с чем." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[10.126631103850338, 10.373491181781864, 11.695247021764184, 8.517193191416238]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "log_income = [math.log(i) for i in income] \n", "log_income" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь таким же образом получим список из натуральных логарифмов:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 5" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "words = [\"Speak \",\"to\", \"me \", \"of\", \"Florence\" ,\"And \", \"of\", \"the\", \"Renaissance\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для закрепления воспользуемся списковыми включениями еще раз. Если учесть, что методы на одних и тех же объектах можно «наслаивать» друг на друга, получим очень лаконичное решение в одну строчку:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['speak', 'to', 'me', 'of', 'florence', 'and', 'of', 'the', 'renaissance']" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "words_clean = [w.lower().strip() for w in words]\n", "words_clean" ] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }