{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python Set Comprehensions\n",
    "Note that Python sets are not ordered, and duplicates are automatically removed.  \n",
    "Otherwise, comprehensions work just like with lists.  \n",
    "General syntax is: new_set = {expression for item in iterable if condition}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Simple Comprehension using Range"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}\n"
     ]
    }
   ],
   "source": [
    "ints = {i for i in range(10)}\n",
    "print(ints)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprehension using Range with a Condition filter\n",
    "Only take even values from range"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 2, 4, 6, 8}\n"
     ]
    }
   ],
   "source": [
    "evens = {i for i in range(10) if i%2 == 0}\n",
    "print(evens)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Apply math function to values in range\n",
    "Here, square each value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}\n"
     ]
    }
   ],
   "source": [
    "squares = {i*i for i in range(10)}\n",
    "print(squares)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that Python eliminates duplicates from sets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 4, 9, 16, 25}\n"
     ]
    }
   ],
   "source": [
    "sqrs = {i*i for i in range(-5, 5)}\n",
    "print(sqrs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Set Comprehension on a List"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{4, 9, 169, 49, 121, 25}\n"
     ]
    }
   ],
   "source": [
    "primes = [2, 2, 2, 3, 3, 5, 5, 5, 7, 11, 11, 13, 13, 13, 13]\n",
    "primes_squared = {p*p for p in primes}\n",
    "print(primes_squared)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### More Complex Expressions: quadratic transformation\n",
    "Any expression is allowed. More complex expressions can be put in parentheses.  \n",
    "Here, quadratic equation:  \n",
    "2x^2 + 5x + 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{43, 143, 307, 85, 28, 413}\n"
     ]
    }
   ],
   "source": [
    "transformed = {(2*x*x + 5*x + 10) for x in primes}\n",
    "print(transformed)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Flatten List and eliminate duplicates\n",
    "Syntax: {leaf for branch in tree for leaf in branch}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 2, 3, 98, 76}\n"
     ]
    }
   ],
   "source": [
    "nums = [[1,3],[2,3],[3,98],[76,1]]\n",
    "flat_set = {a for b in nums for a in b}\n",
    "print(flat_set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Eliminate Dups from a List\n",
    "We can easily eliminate differences in capitalization, while removing duplicates."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Albert', 'Ella', 'George', 'Salil'}\n"
     ]
    }
   ],
   "source": [
    "names = ['salil', 'ALBERT', 'Ella', 'george', 'Salil', 'George', 'ELLA', 'Albert']\n",
    "names_set = {n.capitalize() for n in names}\n",
    "print(names_set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And it's easy to convert this back to a list."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Albert', 'Ella', 'George', 'Salil']\n"
     ]
    }
   ],
   "source": [
    "names_set = list({n.capitalize() for n in names})\n",
    "print(names_set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Get Car Make from list of Make & Model\n",
    "We're getting the first word from each string."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Toyota', 'Tesla', 'Chevy'}\n"
     ]
    }
   ],
   "source": [
    "cars = ['Toyota Prius', 'Chevy Bolt', 'Tesla Model 3', 'Tesla Model Y']\n",
    "makes = {(c.split()[0]) for c in cars}\n",
    "print(makes)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Get Initials from Names\n",
    "Take first and last initials"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'CB', 'NF', 'HP'}\n"
     ]
    }
   ],
   "source": [
    "names = ['Clint Barton', 'Tony', 'Nick Fury', 'Hank Pym']\n",
    "inits = {(n.split()[0][0] + n.split()[1][0]) for n in names if len(n.split())==2}\n",
    "print(inits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}