{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python для сбора и анализа данных\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Семинар 2: списки и строки\n", "\n", "### Задание 0\n", "\n", "Даны два списка `a` и `b`:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "a = [1, 0, 9, 12, 18, 34, 89, 91, 33, 127]\n", "b = [2, 8, 9, 11, 76, 25, 44]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Выведите на экран первый элемент списка `a`, третий элемент списка `a`, последний элемент списка `a`.\n", "2. Добавьте в список `b` элемент 7 (просто допишите в конец).\n", "3. Замените пятый элемент списка `a` на число 8.\n", "4. Создайте список `merged`, который включает в себя все элементы списка `a` и списка `b`.\n", "5. Создайте новый список `c`, который получается заменой последнего элемента списка `a` на число 100. Сам список `a` измениться не должен!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 9 127\n" ] } ], "source": [ "# 1\n", "print(a[0], a[2], a[-1])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2, 8, 9, 11, 76, 25, 44, 7]\n" ] } ], "source": [ "# 2\n", "b.append(7)\n", "print(b) " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 0, 9, 12, 8, 34, 89, 91, 33, 127]\n" ] } ], "source": [ "# 3\n", "a[4] = 8\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 0, 9, 12, 8, 34, 89, 91, 33, 127, 2, 8, 9, 11, 76, 25, 44, 7]\n" ] } ], "source": [ "# 4 вариант 1\n", "merged = a + b\n", "print(merged)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 0, 9, 12, 8, 34, 89, 91, 33, 127, 2, 8, 9, 11, 76, 25, 44, 7]\n" ] } ], "source": [ "# 4 вариант 2\n", "merged = a.copy()\n", "merged.extend(b)\n", "print(merged)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 0, 9, 12, 8, 34, 89, 91, 33, 100]\n" ] } ], "source": [ "# 5\n", "c = a.copy() # c = a[:] \n", "c[-1] = 100\n", "print(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 1\n", "\n", "Есть список имён:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "girls = [\"Иветта\", \"Виолетта\", \"Кассандра\", \"Вирджиния\", \n", " \"Амелия\", \"Розамунда\", \"Янина\", \"Беатриса\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Используя список `girls`, выведите на экран следующие списки:\n", "\n", " [\"Виолетта\", \"Кассандра\", \"Вирджиния\", \"Амелия\"]\n", " [\"Вирджиния\", \"Амелия\", \"Розамунда\", \"Янина\", \"Беатриса\"]\n", " [\"Иветта\", \"Виолетта\", \"Вирджиния\", \"Амелия\"]\n", " [\"Кассандра\", \"Амелия\", \"Розамунда\"]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Виолетта', 'Кассандра', 'Вирджиния', 'Амелия']\n", "['Вирджиния', 'Амелия', 'Розамунда', 'Янина', 'Беатриса']\n", "['Иветта', 'Виолетта', 'Вирджиния', 'Амелия']\n", "['Кассандра', 'Амелия', 'Розамунда']\n" ] } ], "source": [ "print(girls[1:5])\n", "print(girls[3:])\n", "print(girls[0:2] + girls[3:5])\n", "print(girls[2:3] + girls[4:6])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Кассандра', 'Амелия', 'Розамунда']\n" ] } ], "source": [ "# менее красивый вариант для последнего\n", "print([girls[2]] + girls[4:6]) " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Виолетта', 'Кассандра', 'Вирджиния', 'Амелия']\n", "['Вирджиния', 'Амелия', 'Розамунда', 'Янина', 'Беатриса']\n", "['Иветта', 'Виолетта', 'Вирджиния', 'Амелия']\n", "['Кассандра', 'Амелия', 'Розамунда']\n", "\n" ] } ], "source": [ "# объединенный вариант, \n", "# символ \\n – для перехода на новую строку\n", "\n", "print(girls[1:5], \"\\n\", \n", " girls[3:], \"\\n\", \n", " girls[0:2] + girls[3:5], \"\\n\", \n", " girls[2:3] + girls[4:6], \"\\n\", \n", " sep = \"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 2\n", "\n", "Дан список `L`. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "L = [12, 3, 8, 125, 10, 98, 54, 199]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Выведите на экран (последовательно, с новой строчки):\n", "\n", "* все элементы списка `L`;\n", "* логарифмированные значения элементов списка `L`.\n", "\n", "Замените пятый элемент списка `L` на 0. Проделайте те же операции, что и раньше. Объясните, почему получаются такие результаты." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "12 2.4849066497880004\n", "3 1.0986122886681098\n", "8 2.0794415416798357\n", "125 4.8283137373023015\n", "10 2.302585092994046\n", "98 4.584967478670572\n", "54 3.9889840465642745\n", "199 5.293304824724492\n" ] } ], "source": [ "from math import log\n", "for i in L:\n", " print(i, log(i))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "12 2.4849066497880004\n", "3 1.0986122886681098\n", "8 2.0794415416798357\n", "125 4.8283137373023015\n" ] }, { "ename": "ValueError", "evalue": "math domain error", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: math domain error" ] } ], "source": [ "# ломается – выход их цикла\n", "L[4] = 0\n", "for i in L:\n", " print(i, log(i))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 3\n", "\n", "Объясните, что делает следующий код и почему он выдает такие результаты:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "3\n", "5\n", "7\n" ] } ], "source": [ "M = [1, 2, 3, 4]\n", "\n", "for i in range(len(M)):\n", " a = M[i] + M[i-1]\n", " print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Разберем код на части. Что такое `range(len(M))`?" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 1, 2, 3]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(len(M))) # индексы элементов списка M" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Значит, цикл `for` бегает по индексам списка `M`. Тогда `M[i]` – это i-тый элемент списка `M`, а `M[i-1]` – элемент, предшествующий i-тому элементу. Эти два элемента складываются, и результат сохраняется в `a`.\n", "\n", "Посмотрим. Если `i = 0`, то получаем `M[0]` и `M[-1]`. Значит, на первом шаге (на первой итерации) цикла мы складываем первый и последний элементы списка.\n", "\n", " 1 + 4 = 5\n", "\n", "Двигаемся дальше. Если `i = 1`, то получаем `M[1]` и `M[0]`. Значит, на втором шаге цикла мы складываем второй и первый элементы списка.\n", "\n", " 2 + 1 = 3\n", "\n", "И так далее.\n", "\n", "Почему этот код интересен? Потому, что он не ломается: Python не возражает против отрицательных индексов элементов, он просто начинает считать элементы с конца списка." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "3\n", "5\n", "7\n" ] } ], "source": [ "# альтернатива коду без range()\n", "\n", "for i in M:\n", " a = i + M[M.index(i) - 1]\n", " print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 4\n", "\n", "Дан список `L`:\n", "\n", " L = [4, 8, 9, 0, 10, 12, 56, 6, 7]\n", "\n", "Напишите программу, которая запрашивает у пользователя с клавиатуры индекс элемента в списке `L`, новое значение этого элемента, а потом заменяет старое значение новым. Список `L` должен измениться.\n", "\n", "**Пример:** пользователь ввел числа 3 и 100, и список `L` стал таким:\n", "\n", " L = [4, 8, 9, 100, 10, 12, 56, 6, 7]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "L = [4, 8, 9, 0, 10, 12, 56, 6, 7]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter index: 4\n", "Enter value: 999\n", "[4, 8, 9, 0, 999.0, 12, 56, 6, 7]\n" ] } ], "source": [ "ind = int(input(\"Enter index: \"))\n", "k = float(input(\"Enter value: \"))\n", "L[ind] = k\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 5\n", "\n", "Напишите программу, которая запрашивает у пользователя с клавиатуры два числа и возвращает список целых чисел, которые находятся в промежутке между этими числами (исключая указанные числа).\n", "\n", "**Пример:** пользователь ввел число 5 и число 9, ему вернулся список `[6, 7, 8]`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter two integers: 6 10\n", "[7, 8, 9]\n" ] } ], "source": [ "inp = input(\"Enter two integers: \")\n", "s1, s2 = inp.split() \n", "n1 = int(s1)\n", "n2 = int(s2) \n", "nums = list(range(n1 + 1, n2)) \n", "print(nums) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 6\n", "\n", "Напишите программу, которая запрашивает у пользователя с клавиатуры целое число $n$ и выводит на экран сумму квадратов целых чисел от 0 до $n$. В процессе решения списки создавать нельзя!" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "55\n" ] } ], "source": [ "n = int(input())\n", "sum_sq = 0\n", "\n", "# range(n + 1)\n", "for j in range(0, n + 1):\n", " sum_sq = sum_sq + j ** 2\n", " \n", "print(sum_sq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 7\n", "\n", "Напишите программу, которая запрашивает у пользователя его фамилию, имя, отчество, введенные в одну строчку через пробел, и выводит на экран сообщения:\n", "\n", " Ваша фамилия: фамилия\n", " Ваше имя: имя\n", " Ваше отчество: отчество\n", " \n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " Введите Ваши ФИО: Тамбовцева Алла Андреевна\n", "\n", "*Выходные данные:*\n", "\n", " Ваша фамилия: Тамбовцева\n", " Ваше имя: Алла\n", " Ваше отчество: Андреевна" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Введите Ваши ФИО: Тамбовцева Алла Андреевна\n", "Ваша фамилия: Тамбовцева\n", "Ваше имя: Алла\n", "Ваше отчество: Андреевна\n" ] } ], "source": [ "fio = input(\"Введите Ваши ФИО: \") \n", "f, i, o = fio.split()\n", "print(\"Ваша фамилия:\", f)\n", "print(\"Ваше имя:\", i)\n", "print(\"Ваше отчество:\", o) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 8\n", "\n", "Напишите программу, которая берет строку \"1; 2; 3; 100\" и возвращает:\n", "\n", "* список из целых чисел;\n", "* список из чисел с плавающей точкой." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "s = \"1; 2; 3; 100\"" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 100]\n" ] } ], "source": [ "ints = [int(i) for i in s.split(\"; \")] \n", "print(ints) " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# альтернатива с обычным циклом for\n", "ints = []\n", "for i in s.split(\"; \"):\n", " ints.append(int(i)) " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.0, 2.0, 3.0, 100.0]\n" ] } ], "source": [ "floats = [float(i) for i in s.split(\"; \")] \n", "print(floats) " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# альтернатива с обычным циклом for\n", "floats = []\n", "for i in s.split(\"; \"):\n", " floats.append(float(i)) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 9\n", "\n", "Напишите программу, которая принимает на вход список слов такого вида:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "words = [\"Speak \", \"to\", \"me \", \"of\", \"Florence \",\n", " \"And \", \"of\", \"the\", \"Renaissance\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "а возвращает список" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "words_clean = [\"speak\", \"to\", \"me\", \"of\", \"florence\", \n", " \"and\", \"of\", \"the\", \"renaissance\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Другими словами, программа убирает пробелы в словах и приводит все слова к нижнему регистру.\n", "\n", "**Подсказка:** запросите `help()` по методам `.strip()` и `.lower()`." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['speak', 'to', 'me', 'of', 'florence', 'and', 'of', 'the', 'renaissance']\n" ] } ], "source": [ "words_clean = [w.strip().lower() for w in words]\n", "print(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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }