{
 "metadata": {
  "name": "data_structures"
 }, 
 "nbformat": 2, 
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown", 
     "source": [
      "### Tuple ###", 
      "denoted with parentheses"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "t = (12,-1)", 
      "print type(t)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "<type 'tuple'>"
       ]
      }
     ], 
     "prompt_number": 1
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print isinstance(t,tuple)", 
      "print len(t)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "True", 
        "2"
       ]
      }
     ], 
     "prompt_number": 2
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "t = (12,\"monty\",True,-1.23e6)", 
      "print t[1]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "monty"
       ]
      }
     ], 
     "prompt_number": 3
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print t[-1]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "-1230000.0"
       ]
      }
     ], 
     "prompt_number": 4
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "t[-2:]  # get the last two elements, return as a tuple"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 5, 
       "text": [
        "(True, -1230000.0)"
       ]
      }
     ], 
     "prompt_number": 5
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "x = (True) ; print type(x)", 
      "x = (True,) ; print type(x)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "<type 'bool'>", 
        "<type 'tuple'>"
       ]
      }
     ], 
     "prompt_number": 6
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "type(()), len(())"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 7, 
       "text": [
        "(tuple, 0)"
       ]
      }
     ], 
     "prompt_number": 7
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "type((,))"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "SyntaxError", 
       "evalue": "invalid syntax (<ipython-input-8-21eccbe9b1de>, line 1)", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-8-21eccbe9b1de>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m    type((,))\u001b[0m\n\u001b[0m          ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
       ]
      }
     ], 
     "prompt_number": 8
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "single-element tuples look like `(element,)`"
     ]
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "cannot change a tuple", 
      "but you can create new one with concatenation"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "t[2] = False"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "TypeError", 
       "evalue": "'tuple' object does not support item assignment", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)", 
        "\u001b[0;32m/Users/jbloom/Classes/python-bootcamp/DataFiles_and_Notebooks/02_AdvancedDataStructures/<ipython-input-9-9365ccccf007>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment"
       ]
      }
     ], 
     "prompt_number": 9
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "t[0:2], False, t[3:]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 10, 
       "text": [
        "((12, 'monty'), False, (-1230000.0,))"
       ]
      }
     ], 
     "prompt_number": 10
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "## the above it ", 
      "## not what we wanted... need to concatenate", 
      "t[0:2] + False + t[3:]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "TypeError", 
       "evalue": "can only concatenate tuple (not \"bool\") to tuple", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)", 
        "\u001b[0;32m/Users/jbloom/Classes/python-bootcamp/DataFiles_and_Notebooks/02_AdvancedDataStructures/<ipython-input-11-73d4c94ec2bf>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m## the above it\u001b[0m\n\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;31m## not what we wanted... need to concatenate\u001b[0m\n\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mFalse\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[0;31mTypeError\u001b[0m: can only concatenate tuple (not \"bool\") to tuple"
       ]
      }
     ], 
     "prompt_number": 11
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "y = t[0:2] + (False,) + t[3:] ; print y"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "(12, 'monty', False, -1230000.0)"
       ]
      }
     ], 
     "prompt_number": 12
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "t*2"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 13, 
       "text": [
        "(12, 'monty', True, -1230000.0, 12, 'monty', True, -1230000.0)"
       ]
      }
     ], 
     "prompt_number": 13
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "### List ###", 
      "#### denoted with a brackets ####"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v = [1,2,3] ; print len(v), type(v)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "3 <type 'list'>"
       ]
      }
     ], 
     "prompt_number": 14
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v[0:2]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 15, 
       "text": [
        "[1, 2]"
       ]
      }
     ], 
     "prompt_number": 15
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v = [\"eggs\",\"spam\",-1,(\"monty\",\"python\"),[-1.2,-3.5]]", 
      "len(v)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 16, 
       "text": [
        "5"
       ]
      }
     ], 
     "prompt_number": 16
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v[0] =\"green egg\"", 
      "v[1] += \",love it.\"", 
      "v[-1]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 17, 
       "text": [
        "[-1.2, -3.5]"
       ]
      }
     ], 
     "prompt_number": 17
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v[-1][1] = None ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "['green egg', 'spam,love it.', -1, ('monty', 'python'), [-1.2, None]]"
       ]
      }
     ], 
     "prompt_number": 18
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v = v[2:] ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[-1, ('monty', 'python'), [-1.2, None]]"
       ]
      }
     ], 
     "prompt_number": 19
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "# let's make a proto-array out of nested lists", 
      "vv = [ [1,2], [3,4] ]"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 20
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print len(vv)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "2"
       ]
      }
     ], 
     "prompt_number": 21
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "determinant = vv[0][0]*vv[1][1] - vv[0][1]*vv[1][0]", 
      "print determinant"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "-2"
       ]
      }
     ], 
     "prompt_number": 22
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "the main point here: lists are **changeable**", 
      "", 
      "[back to slides]"
     ]
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "### List ###", 
      "#### lists can be extended, appended, and popped ####"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v = [1,2,3]", 
      "v.append(4)", 
      "v.append([-5]) ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[1, 2, 3, 4, [-5]]"
       ]
      }
     ], 
     "prompt_number": 23
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v = v[:4]", 
      "w = ['elderberries', 'eggs']", 
      "v + w"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 24, 
       "text": [
        "[1, 2, 3, 4, 'elderberries', 'eggs']"
       ]
      }
     ], 
     "prompt_number": 24
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.extend(w) ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[1, 2, 3, 4, 'elderberries', 'eggs']"
       ]
      }
     ], 
     "prompt_number": 25
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.pop()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 26, 
       "text": [
        "'eggs'"
       ]
      }
     ], 
     "prompt_number": 26
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[1, 2, 3, 4, 'elderberries']"
       ]
      }
     ], 
     "prompt_number": 27
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.pop(0) ; print v ## pop the first element"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[2, 3, 4, 'elderberries']"
       ]
      }
     ], 
     "prompt_number": 28
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      " * `.append()`: adds a new element", 
      " * `.extend()`: concatenates a list/element", 
      " * `.pop()`: remove an element"
     ]
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "#### lists can be searched, sorted, & counted ####"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v = [1,3, 2, 3, 4, 'elderberries']", 
      "v.sort() ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[1, 2, 3, 3, 4, 'elderberries']"
       ]
      }
     ], 
     "prompt_number": 29
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "`reverse` is a keyword of the `.sort()` method"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.sort(reverse=True) ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "['elderberries', 4, 3, 3, 2, 1]"
       ]
      }
     ], 
     "prompt_number": 30
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "`.sort()` changes the the list in place "
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.index(4)   ## lookup the index of the entry 4"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 31, 
       "text": [
        "1"
       ]
      }
     ], 
     "prompt_number": 31
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.index(3)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 32, 
       "text": [
        "2"
       ]
      }
     ], 
     "prompt_number": 32
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.count(3)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 33, 
       "text": [
        "2"
       ]
      }
     ], 
     "prompt_number": 33
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.insert(0,\"it's full of stars\") ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[\"it's full of stars\", 'elderberries', 4, 3, 3, 2, 1]"
       ]
      }
     ], 
     "prompt_number": 34
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "v.remove(1) ; print v"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[\"it's full of stars\", 'elderberries', 4, 3, 3, 2]"
       ]
      }
     ], 
     "prompt_number": 35
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "[back]"
     ]
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "### List ###", 
      "#### iteration ####"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "a = ['cat', 'window', 'defenestrate']", 
      "for x in a:", 
      "       print x, len(x)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "cat 3", 
        "window 6", 
        "defenestrate 12"
       ]
      }
     ], 
     "prompt_number": 37
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "for i,x in enumerate(a):", 
      "       print i, x, len(x)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "0 cat 3", 
        "1 window 6", 
        "2 defenestrate 12"
       ]
      }
     ], 
     "prompt_number": 38
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "for x in a:", 
      "       print x,"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "cat window defenestrate"
       ]
      }
     ], 
     "prompt_number": 39
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "The syntax for iteration is...  ", 
      "", 
      "    for variable_name in iterable:", 
      "       # do something with variable_name"
     ]
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "The `range()` function"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "x = range(4) ; print x", 
      "total = 0", 
      "for val in range(4):", 
      "        total += val", 
      "        print \"By adding \" + str(val) + \\", 
      "              \" the total is now \" + str(total)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[0, 1, 2, 3]", 
        "By adding 0 the total is now 0", 
        "By adding 1 the total is now 1", 
        "By adding 2 the total is now 3", 
        "By adding 3 the total is now 6"
       ]
      }
     ], 
     "prompt_number": 41
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "", 
      "`range`([`start`,] `stop`[, `step`])", 
      "\u2192 list of integers"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "total = 0", 
      "for val in range(1,10,2):", 
      "    total += val", 
      "    print \"By adding \" + str(val) + \\", 
      "          \" the total is now \" + str(total)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "By adding 1 the total is now 1", 
        "By adding 3 the total is now 4", 
        "By adding 5 the total is now 9", 
        "By adding 7 the total is now 16", 
        "By adding 9 the total is now 25"
       ]
      }
     ], 
     "prompt_number": 42
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "a = ['Mary', 'had', 'a', 'little', 'lamb']", 
      "for i in range(len(a)):", 
      "    print i, a[i]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "0 Mary", 
        "1 had", 
        "2 a", 
        "3 little", 
        "4 lamb"
       ]
      }
     ], 
     "prompt_number": 43
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "### Sets ###", 
      "#### denoted with a curly braces ####"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "{1,2,3,\"bingo\"}"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 45, 
       "text": [
        "set(['bingo', 1, 2, 3])"
       ]
      }
     ], 
     "prompt_number": 45
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print type({1,2,3,\"bingo\"})"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "<type 'set'>"
       ]
      }
     ], 
     "prompt_number": 47
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print  type({})"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "<type 'dict'>"
       ]
      }
     ], 
     "prompt_number": 48
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print type(set())"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "<type 'set'>"
       ]
      }
     ], 
     "prompt_number": 50
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "set(\"spamIam\")"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 51, 
       "text": [
        "set(['a', 'p', 's', 'm', 'I'])"
       ]
      }
     ], 
     "prompt_number": 51
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "sets have unique elements. They can be", 
      "compared, differenced, unionized, etc."
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "a = set(\"sp\"); b = set(\"am\"); print a ; print b"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "set(['p', 's'])", 
        "set(['a', 'm'])"
       ]
      }
     ], 
     "prompt_number": 52
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "c = set([\"a\",\"m\"])", 
      "c == b"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 53, 
       "text": [
        "True"
       ]
      }
     ], 
     "prompt_number": 53
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "\"p\" in a"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 54, 
       "text": [
        "True"
       ]
      }
     ], 
     "prompt_number": 54
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "\"ps\" in a"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 55, 
       "text": [
        "False"
       ]
      }
     ], 
     "prompt_number": 55
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "q = set(\"spamIam\")", 
      "a.issubset(q)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 57, 
       "text": [
        "True"
       ]
      }
     ], 
     "prompt_number": 57
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "a | b"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 58, 
       "text": [
        "set(['a', 'p', 's', 'm'])"
       ]
      }
     ], 
     "prompt_number": 58
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "q - (a | b)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 59, 
       "text": [
        "set(['I'])"
       ]
      }
     ], 
     "prompt_number": 59
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "q & (a | b)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 60, 
       "text": [
        "set(['a', 'p', 's', 'm'])"
       ]
      }
     ], 
     "prompt_number": 60
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "Like lists, we can use as (unordered) buckets", 
      "`.pop()` gives us a random element"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# this is pretty volitile...wont be the same", 
      "# order on all machines", 
      "for i in q & (a | b):", 
      "    print i, "
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "a p s m"
       ]
      }
     ], 
     "prompt_number": 62
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "q.remove(\"a\")"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 63
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "q.pop()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 64, 
       "text": [
        "'p'"
       ]
      }
     ], 
     "prompt_number": 64
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print q.pop()", 
      "print q.pop()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "s", 
        "m"
       ]
      }
     ], 
     "prompt_number": 65
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print q.pop()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "I"
       ]
      }
     ], 
     "prompt_number": 66
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "q.pop()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "KeyError", 
       "evalue": "'pop from an empty set'", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)", 
        "\u001b[0;32m/Users/jbloom/Classes/python-bootcamp/DataFiles_and_Notebooks/02_AdvancedDataStructures/<ipython-input-68-16da542f89c5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[0;31mKeyError\u001b[0m: 'pop from an empty set'"
       ]
      }
     ], 
     "prompt_number": 68
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "[back]"
     ]
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "### 4 ways to make a Dictionary ###"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "# number 1...you've seen this", 
      "d = {\"favorite cat\": None, \"favorite spam\": \"all\"}"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 69
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# number 2", 
      "d = dict(one = 1, two=2,cat = 'dog') ; print d"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "{'cat': 'dog', 'two': 2, 'one': 1}"
       ]
      }
     ], 
     "prompt_number": 70
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# number 3 ... just start filling in items/keys", 
      "d = {}  # empty dictionary", 
      "d['cat'] = 'dog'", 
      "d['one'] = 1", 
      "d['two'] = 2", 
      "d"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 71, 
       "text": [
        "{'cat': 'dog', 'one': 1, 'two': 2}"
       ]
      }
     ], 
     "prompt_number": 71
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# number 4... start with a list of tuples", 
      "mylist = [(\"cat\",\"dog\"), (\"one\",1),(\"two\",2)]", 
      "print dict(mylist)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "{'one': 1, 'two': 2, 'cat': 'dog'}"
       ]
      }
     ], 
     "prompt_number": 72
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "dict(mylist) == d"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 73, 
       "text": [
        "True"
       ]
      }
     ], 
     "prompt_number": 73
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "#### Dictionaries: they can be complicated (in a good way) ####"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "d = {\"favorite cat\": None, \"favorite spam\": \"all\"}"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 75
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "d = {'favorites': {'cat': None, 'spam': 'all'}, \\", 
      "     'least favorite': {'cat': 'all', 'spam': None}}", 
      "print d['least favorite']['cat']"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "all"
       ]
      }
     ], 
     "prompt_number": 78
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "remember: the backslash (\\) allows you to across break lines. Not technically needed when defining a dictionary or list"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "phone_numbers = {'family': [('mom','642-2322'),('dad','534-2311')],\\", 
      "                     'friends': [('Billy','652-2212')]}"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 79
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "for group_type in ['friends','family']:", 
      "        print \"Group \" + group_type + \":\"", 
      "        for info in phone_numbers[group_type]:", 
      "             print \" \",info[0], info[1]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "Group friends:", 
        "  Billy 652-2212", 
        "Group family:", 
        "  mom 642-2322", 
        "  dad 534-2311"
       ]
      }
     ], 
     "prompt_number": 80
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# this will return a list, but you dont know in what order! ", 
      "phone_numbers.keys()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 81, 
       "text": [
        "['friends', 'family']"
       ]
      }
     ], 
     "prompt_number": 81
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "phone_numbers.values()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 82, 
       "text": [
        "[[('Billy', '652-2212')], [('mom', '642-2322'), ('dad', '534-2311')]]"
       ]
      }
     ], 
     "prompt_number": 82
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "`.keys()` and `.values()`: are called `methods` on dictionaries"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "for group_type in phone_numbers.keys():", 
      "        print \"Group \" + group_type + \":\"", 
      "        for info in phone_numbers[group_type]:", 
      "             print \" \",info[0], info[1]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "Group friends:", 
        "  Billy 652-2212", 
        "Group family:", 
        "  mom 642-2322", 
        "  dad 534-2311"
       ]
      }
     ], 
     "prompt_number": 83
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "we cannot ensure ordering here of the groups"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "groups = phone_numbers.keys()", 
      "groups.sort()", 
      "for group_type in groups:", 
      "        print \"Group \" + group_type + \":\"", 
      "        for info in phone_numbers[group_type]:", 
      "             print \" \",info[0], info[1]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "Group family:", 
        "  mom 642-2322", 
        "  dad 534-2311", 
        "Group friends:", 
        "  Billy 652-2212"
       ]
      }
     ], 
     "prompt_number": 84
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "`.iteritems()` is a handy method,", 
      "returning key,value pairs with each iteration"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "for group_type, vals in phone_numbers.iteritems():", 
      "        print \"Group \" + group_type + \":\"", 
      "        for info in vals:", 
      "             print \" \",info[0], info[1]"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "Group friends:", 
        "  Billy 652-2212", 
        "Group family:", 
        "  mom 642-2322", 
        "  dad 534-2311"
       ]
      }
     ], 
     "prompt_number": 85
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "Some examples of getting values:"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "phone_numbers['co-workers']"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "KeyError", 
       "evalue": "'co-workers'", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mKeyError\u001b[0m                                  Traceback (most recent call last)", 
        "\u001b[0;32m/Users/jbloom/Classes/python-bootcamp/DataFiles_and_Notebooks/02_AdvancedDataStructures/<ipython-input-86-92d1a5b9b960>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mphone_numbers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'co-workers'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[0;31mKeyError\u001b[0m: 'co-workers'"
       ]
      }
     ], 
     "prompt_number": 86
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "phone_numbers.has_key('co-workers')"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 87, 
       "text": [
        "False"
       ]
      }
     ], 
     "prompt_number": 87
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print phone_numbers.get('co-workers')"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "None"
       ]
      }
     ], 
     "prompt_number": 88
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "phone_numbers.get('friends') == phone_numbers['friends']"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 89, 
       "text": [
        "True"
       ]
      }
     ], 
     "prompt_number": 89
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print phone_numbers.get('co-workers',\"all alone\")"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "all alone"
       ]
      }
     ], 
     "prompt_number": 90
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "#### setting values ####", 
      "", 
      "you can edit the values of keys and also `.pop()` & `del` to remove certain keys"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# add to the friends list", 
      "phone_numbers['friends'].append((\"Marsha\",\"232-1121\"))", 
      "print phone_numbers"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "{'friends': [('Billy', '652-2212'), ('Marsha', '232-1121')], 'family': [('mom', '642-2322'), ('dad', '534-2311')]}"
       ]
      }
     ], 
     "prompt_number": 91
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "## billy's number changed", 
      "phone_numbers['friends'][0][1] = \"532-1521\""
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "TypeError", 
       "evalue": "'tuple' object does not support item assignment", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)", 
        "\u001b[0;32m/Users/jbloom/Classes/python-bootcamp/DataFiles_and_Notebooks/02_AdvancedDataStructures/<ipython-input-92-564c1535cc4d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m## billy's number changed\u001b[0m\n\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mphone_numbers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'friends'\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[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"532-1521\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment"
       ]
      }
     ], 
     "prompt_number": 92
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "phone_numbers['friends'][0] = (\"Billy\",\"532-1521\")"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 93
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "## I lost all my friends preparing for this Python class", 
      "phone_numbers['friends'] = [] # sets this to an empty list"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 94
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "## remove the friends key altogether", 
      "print phone_numbers.pop('friends')"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "[]"
       ]
      }
     ], 
     "prompt_number": 95
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print phone_numbers"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "{'family': [('mom', '642-2322'), ('dad', '534-2311')]}"
       ]
      }
     ], 
     "prompt_number": 96
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [
      "del phone_numbers['family']"
     ], 
     "language": "python", 
     "outputs": [], 
     "prompt_number": 97
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "print phone_numbers"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "{}"
       ]
      }
     ], 
     "prompt_number": 98
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "`.update()` method is very handy, like `.append()` for lists"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "phone_numbers.update({\"friends\": [(\"Billy's Brother, Bob\", \"532-1521\")]})", 
      "print phone_numbers"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "{'friends': [(\"Billy's Brother, Bob\", '532-1521')]}"
       ]
      }
     ], 
     "prompt_number": 99
    }, 
    {
     "cell_type": "markdown", 
     "source": [
      "[back]"
     ]
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [], 
     "language": "python", 
     "outputs": []
    }
   ]
  }
 ]
}