{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span style=\"color: DarkMagenta\">Теоретический матераил для лабораторных работ</span>\n",
    "\n",
    "## <span style=\"color: Purple\">\"Инструменты и библиотеки языка Python\"</span>\n",
    "\n",
    "# <span style=\"color: DarkMagenta\">Множества &#128105;&#8205;&#128187;</span>\n",
    "\n",
    "## <span style=\"color: Purple\">Создание множеств &#128221;</span>\n",
    "\n",
    "* инициализация путём перечисления элементов множества через запятую в **{}**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0.6, False, None, 'cat', -2000.0, 50, (3, 4, 5), range(0, 3), '!'}\n",
      "<class 'set'>\n"
     ]
    }
   ],
   "source": [
    "a = {50, -2e3, 0.6, None, False, '!', 'cat', (3, 4, 5), range(3)}\n",
    "print(a)\n",
    "print(type(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* функция **set()** создаёт множества из списков, строк, кортежей и диапазона (класс **range()**)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 3, 7, 9, -7, -1}\n",
      "<class 'set'>\n"
     ]
    }
   ],
   "source": [
    "b = [3, -7, 1, 7, 9, 0, -1]\n",
    "a = set(b)\n",
    "print(a)\n",
    "print(type(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'а', 'с', 'е', 'т', 'д', 'р', 'о', 'и'}\n",
      "<class 'set'>\n"
     ]
    }
   ],
   "source": [
    "b = 'астероид'\n",
    "a = set(b)\n",
    "print(a)\n",
    "print(type(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 2, 4, 6, 8, 10, -10, -8, -6, -4, -2}\n",
      "<class 'set'>\n"
     ]
    }
   ],
   "source": [
    "b = range(-10, 11, 2)\n",
    "a = set(b)\n",
    "print(a)\n",
    "print(type(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\"> \n",
    "    \n",
    "<b><span style=\"color: DarkBlue\">&#10071; Пустое множество &#10071;</span></b>\n",
    "\n",
    "Создать пустое множество можно ТОЛЬКО при помощи функции **set()**!  \n",
    "</div>\n",
    "\n",
    "* генератор множест создаёт множества с помощью **{}**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 4, 9, 16, 25}\n",
      "<class 'set'>\n"
     ]
    }
   ],
   "source": [
    "a = {i ** 2 for i in range(1, 6)}\n",
    "print(a)\n",
    "print(type(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\"> \n",
    "    \n",
    "<b><span style=\"color: DarkBlue\">&#10071; Элементы множества &mdash; уникальны &#10071;</span></b>\n",
    "\n",
    "Во множестве не может быть повторов значений элементов!  \n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ожидаем:  {1, 6, 1, 2, 1, 1, 4, 3, 1, 5}\n",
      "Получаем: {1, 2, 3, 4, 5, 6}\n"
     ]
    }
   ],
   "source": [
    "a = {1, 6, 1, 2, 1, 1, 4, 3, 1, 5}\n",
    "print('Ожидаем:  {1, 6, 1, 2, 1, 1, 4, 3, 1, 5}')\n",
    "print('Получаем:', a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <span style=\"color: Purple\">Работа с множествами &#128105;&#8205;&#127979;</span>\n",
    "\n",
    "* доступ к элементам множества"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'m', 'd', 's', 'f', 'u', 'e', '.', 'c', 'r'}\n",
      "m d s f u e . c r "
     ]
    }
   ],
   "source": [
    "a = set('mmcs.sfedu.ru')\n",
    "print(a)\n",
    "\n",
    "for elem in a:\n",
    "    print(elem, end=' ')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* функция **len()**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7\n"
     ]
    }
   ],
   "source": [
    "a = {1, 2, 9, -4, 3, 0, 4}\n",
    "print(len(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* операторы **in** и **not in**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'напрасно', 'гроза.', 'шла', 'дули', 'ветры,', 'Не'}\n",
      "False\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "s = '''\n",
    "Не напрасно дули ветры,\n",
    "Не напрасно шла гроза.\n",
    "'''\n",
    "\n",
    "a = set(s.split())\n",
    "print(a)\n",
    "\n",
    "print('гроза' in a)\n",
    "print('гроза' not in a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* функции **sum()**, **min()** и **max()**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 5, 8, -7}\n",
      "9\n",
      "-7\n",
      "8\n"
     ]
    }
   ],
   "source": [
    "a = {5, -7, 0, 2, 8, 1}\n",
    "print(a)\n",
    "print(sum(a))\n",
    "print(min(a))\n",
    "print(max(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* добавление элементов в множество **add()**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 6, 8, -5, -3}\n",
      "Сколько элементов хотите добавить в множество? 5\n",
      "Введите число >>> -9\n",
      "Введите число >>> 4\n",
      "Введите число >>> 3\n",
      "Введите число >>> 4\n",
      "Введите число >>> 0\n",
      "{0, 1, 2, 3, 4, 6, 8, -9, -5, -3}\n"
     ]
    }
   ],
   "source": [
    "a = {6, -3, 2, 1, 8, 0, -5}\n",
    "print(a)\n",
    "\n",
    "n = int(input('Сколько элементов хотите добавить в множество? '))\n",
    "\n",
    "for _ in range(n):\n",
    "    a.add(int(input('Введите число >>> ')))\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* удаление отдельных элементов по значению\n",
    "\n",
    "    * метод **discard()**\n",
    "    \n",
    "    * метод **remove()**  (вызывает исключение KeyError, если элемент отсутствует или множество пустое)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 3, 4, 5, -1, -5, -4, -3, -2}\n",
      "{1, 2, 3, 4, 5, -1, -5, -4, -3, -2}\n"
     ]
    }
   ],
   "source": [
    "a = set(range(-5, 6))\n",
    "print(a)\n",
    "\n",
    "a.discard(0)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 3, 4, 5, -1, -5, -4, -3, -2}\n",
      "{1, 2, 3, 4, 5, -1, -5, -4, -3, -2}\n"
     ]
    }
   ],
   "source": [
    "a = set(range(-5, 6))\n",
    "print(a)\n",
    "\n",
    "a.remove(0)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set()\n",
      "set()\n"
     ]
    },
    {
     "ename": "KeyError",
     "evalue": "0",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-24-2630bc1d8e73>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[0ma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      8\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 0"
     ]
    }
   ],
   "source": [
    "a = set()\n",
    "print(a)\n",
    "\n",
    "a.discard(0)\n",
    "print(a)\n",
    "\n",
    "a.remove(0)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* удаление одного произвольного элемента множества методом pop (вызывается исключение KeyError, если удалять значение из пустого множества)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 3, 4, 5, -1, -5, -4, -3, -2}\n",
      "{1, 2, 3, 4, 5, -1, -5, -4, -3, -2}\n"
     ]
    }
   ],
   "source": [
    "a = set(range(-5, 6))\n",
    "print(a)\n",
    "\n",
    "a.pop()\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "'pop from an empty set'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-26-76acf6dfd53b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mset\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m: 'pop from an empty set'"
     ]
    }
   ],
   "source": [
    "print(set().pop())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* удаление всех элементов множества"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'л', 'к', 'е', 'с', 'т', 'о', 'п', 'у', 'и', 'н', '-'}\n",
      "set()\n"
     ]
    }
   ],
   "source": [
    "a = set('енотик-полоскун')\n",
    "print(a)\n",
    "\n",
    "a.clear()\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <span style=\"color: Purple\">Операции с множествами &#129417;</span>\n",
    "\n",
    "С множествами в питоне можно выполнять обычные для математики операции над множествами.\n",
    "\n",
    "* **A | B** или **A.union(B)** возвращает множество, являющееся объединением множеств $A$ и $B$. \n",
    "\n",
    "* **A & B** или **A.intersection(B)** возвращает множество, являющееся пересечением множеств $A$ и $B$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2000}\n",
      "{8, 5, 6, 7}\n"
     ]
    }
   ],
   "source": [
    "A = {1, 2, 3, 4, 5, 6, 7, 8}\n",
    "B = {5, 6, 7, 8, 9, 10, 2000}\n",
    "\n",
    "print(A.union(B))\n",
    "print(A & B)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* **A |= B** или **A.update(B)** добавляет в множество $A$ все элементы из множества $B$.\n",
    "\n",
    "* **A &= B** или **A.intersection_update(B)** оставляет в множестве $A$ только те элементы, которые есть в множестве $B$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2000}\n",
      "{5, 6, 7, 8, 9, 10, 2000}\n"
     ]
    }
   ],
   "source": [
    "A = {1, 2, 3, 4, 5, 6, 7, 8}\n",
    "B = {5, 6, 7, 8, 9, 10, 2000}\n",
    "\n",
    "A.update(B)\n",
    "print(A)\n",
    "\n",
    "A.intersection_update(B)\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* **A - B** или **A.difference(B)** возвращает разность множеств $A$ и $B$ (элементы, входящие в $A$, но не входящие в $B$).\n",
    "\n",
    "* **A -= B** или **A.difference_update(B)** удаляет из множества $A$ все элементы, входящие в $B$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 2, 3, 4}\n",
      "{1, 2, 3, 4}\n"
     ]
    }
   ],
   "source": [
    "A = {1, 2, 3, 4, 5, 6, 7, 8}\n",
    "B = {5, 6, 7, 8, 9, 10, 2000}\n",
    "\n",
    "print(A.difference(B))\n",
    "\n",
    "A.difference_update(B)\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* **A ^ B** или **A.symmetric_difference(B)** возвращает симметрическую разность множеств $A$ и $B$ (элементы, входящие в $A$ или в $B$, но не в оба из них одновременно).\n",
    "\n",
    "* **A ^= B** или **A.symmetric_difference_update(B)** записывает в $A$ симметрическую разность множеств $A$ и $B$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 2, 3, 4, 9, 10, 2000}\n",
      "{1, 2, 3, 4, 9, 10, 2000}\n"
     ]
    }
   ],
   "source": [
    "A = {1, 2, 3, 4, 5, 6, 7, 8}\n",
    "B = {5, 6, 7, 8, 9, 10, 2000}\n",
    "\n",
    "print(A.symmetric_difference(B))\n",
    "\n",
    "A.symmetric_difference_update(B)\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* **A <= B** или **A.issubset(B)** возвращает True, если $A$ является подмножеством $B$. \n",
    "\n",
    "* **A >= B** или **A.issuperset(B)** возвращает True, если $B$ является подмножеством $A$.\n",
    "\n",
    "* **A == B** возвращает True, если все элементы $A$ принадлежат $B$, все элементы $B$ принадлежат $A$.\n",
    "\n",
    "* **A != B** возвращает True, если хотя бы один элемент $A$ не принадлежит $B$ или хотя бы один элемент $B$ не принадлежит $A$.\n",
    "\n",
    "* **A < B** эквивалентно A <= B and A != B.\n",
    "\n",
    "* **A > B** эквивалентно A >= B and A != B."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False\n",
      "True\n",
      "False\n",
      "True\n",
      "False\n",
      "True\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "A = {1, 2, 3, 4, 5, 6, 7, 8}\n",
    "B = {5, 6, 7, 8}\n",
    "\n",
    "print(A.issubset(B))\n",
    "print(A.issuperset(B))\n",
    "print(A == B)\n",
    "print(B == {8, 5, 6, 7})\n",
    "print(A < B)\n",
    "print(A > B)\n",
    "print(A != B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.13.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
