{
 "metadata": {
  "language": "Julia",
  "name": ""
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "#5. PLEAC Julia: Dictionaries\n",
      "\n",
      "[PLEAC = Language Examples Alike Cookbook](http://pleac.sourceforge.net/)\n",
      "PLEAC examples are drawn from the \"Perl Cookbook\" by Tom Christiansen & Nathan Torkington, published by O'Reilly.  They provide a nice range of examples oriented toward data munging, the type of work I tend to want to do first when learning a new language.\n",
      "\n",
      "\n",
      "The Julia examples below are principally translations from the [Python version](http://pleac.sourceforge.net/pleac_python/)\n",
      "\n",
      "###A Caution\n",
      "I'm learning as I go, so the code below probably doesn't represent best practice.  Your suggestions are welcome! \n",
      "Please file an issue or make a pull request to the [github repo](https://github.com/catawbasam/IJulia_PLEAC/).\n",
      "\n",
      "The examples are not complete. Missing items are generally noted in comments."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.0: Introduction"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#Dict of Any\n",
      "age = {\"Nat\"=> 24,       \"Jules\"=> 24,       \"Josh\"=> 17}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 1,
       "text": [
        "{\"Jules\"=>24,\"Josh\"=>17,\"Nat\"=>24}"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#typed Dict-- the type will be inferred\n",
      "age = [\"Nat\"=> 24,       \"Jules\"=> 24,       \"Josh\"=> 17]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 2,
       "text": [
        "[\"Jules\"=>24,\"Josh\"=>17,\"Nat\"=>24]"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "age=Dict()\n",
      "age[\"Nat\"] = 24\n",
      "age[\"Jules\"] = 25\n",
      "age[\"Josh\"] = 17"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 3,
       "text": [
        "17"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#in Julia, keys can be Symbols\n",
      "food_color = [:Apple => \"red\",\n",
      "              :Banana=> \"yellow\",\n",
      "              :Lemon => \"yellow\",\n",
      "              :Carrot=> \"orange\"\n",
      "             ]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 4,
       "text": [
        "[:Apple=>\"red\",:Carrot=>\"orange\",:Lemon=>\"yellow\",:Banana=>\"yellow\"]"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.1: Adding an element to a Dict"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# food_color defined per the introduction\n",
      "food_color[:Raspberry] = \"pink\"\n",
      "print( \"Known foods:\" )\n",
      "for food in food_color\n",
      "    print( food )\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Known foods:"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "(:Apple,"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\"red\")(:Raspberry,\"pink\")(:Carrot,\"orange\")(:Lemon,\"yellow\")(:Banana,\"yellow\")"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.2: Testing for the presence of a key in a Dict\n",
      "\n",
      "does dict have a value for key?"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "key = \"Joe\"\n",
      "haskey(age,key)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 6,
       "text": [
        "false"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "key=\"Nat\"\n",
      "haskey(age,key)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 7,
       "text": [
        "true"
       ]
      }
     ],
     "prompt_number": 7
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# food_color per the introduction\n",
      "for name in (:Banana, :Martini)\n",
      "    if name in keys(food_color)\n",
      "        println(\"$name is a food.\")\n",
      "    else\n",
      "        println( \"$name is a drink.\")\n",
      "    end\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Banana is a food."
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Martini is a drink.\n"
       ]
      }
     ],
     "prompt_number": 8
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "age = Dict()\n",
      "age[\"Toddler\"] = 3\n",
      "age[\"Unborn\"] = 0\n",
      "age[\"Phantasm\"] = None"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 9,
       "text": [
        "None"
       ]
      }
     ],
     "prompt_number": 9
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "thing=\"Toddler\"\n",
      "thing ==Nothing"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 10,
       "text": [
        "false"
       ]
      }
     ],
     "prompt_number": 10
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for thing in (\"Toddler\", \"Unborn\", \"Phantasm\", \"Relic\")\n",
      "    print(\"\\n$thing: \")\n",
      "    if haskey(age, thing)\n",
      "        print( \"Exists \")\n",
      "        if age[thing] != None\n",
      "            print(\" Defined\")\n",
      "        end\n",
      "        if age[thing]==true\n",
      "            print( \" true\")\n",
      "        end\n",
      "    end\n",
      "    #println()\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Toddler: "
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Exists  Defined\n",
        "Unborn: Exists  Defined\n",
        "Phantasm: Exists \n",
        "Relic: "
       ]
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#SKIP\n",
      "# Get file sizes for the requested filenames\n",
      "\"\"\"\n",
      "import fileinput, os\n",
      "size = {}\n",
      "for line in fileinput.input():\n",
      "    filename = line.rstrip()\n",
      "    if filename in size:\n",
      "        continue\n",
      "    size[filename] = os.path.getsize(filename)\n",
      "\"\"\";"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 11
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.3: Delete from a Dict\n",
      "\n",
      "remove key and value from dict"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "delete!(age, \"Nat\")"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 12,
       "text": [
        "{\"Toddler\"=>3,\"Unborn\"=>0,\"Phantasm\"=>None}"
       ]
      }
     ],
     "prompt_number": 12
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "foodstr = {\"carrot\"=>\"orange\", \"lemon\"=>\"yellow\", \n",
      "           \"apple\"=>\"green\", \"banana\"=>\"yellow\"}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 13,
       "text": [
        "{\"apple\"=>\"green\",\"carrot\"=>\"orange\",\"lemon\"=>\"yellow\",\"banana\"=>\"yellow\"}"
       ]
      }
     ],
     "prompt_number": 13
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "function print_foods()\n",
      "    foods = keys(foodstr)\n",
      "    println(\"Keys: $(join(foods,' '))\")\n",
      "    println(\"Values: $( join(values(foodstr),' ') )\")\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 14,
       "text": [
        "print_foods (generic function with 1 method)"
       ]
      }
     ],
     "prompt_number": 14
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "println(\"Initially:\")\n",
      "print_foods()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Initially:"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Keys: apple carrot lemon banana\n",
        "Values: green orange yellow yellow\n"
       ]
      }
     ],
     "prompt_number": 15
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "println(\"\\nWith banana set to nothing\")\n",
      "foodstr[\"banana\"]=None  # works for Dict{String,Any}.  for typed Dict, would need a Union(T,None)\n",
      "print_foods()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "With banana set to nothing"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Keys: apple carrot lemon banana\n",
        "Values: green orange yellow None\n"
       ]
      }
     ],
     "prompt_number": 16
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "println(\"\\nWith banana deleted\")\n",
      "delete!( foodstr, \"banana\" )\n",
      "print_foods()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "With banana deleted"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Keys: apple carrot lemon\n",
        "Values: green orange yellow\n"
       ]
      }
     ],
     "prompt_number": 17
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for key in [\"Banana\", \"apple\", \"Cabbage\"] \n",
      "    delete!(foodstr,key)  #delete!() does not mind getting non-existant keys\n",
      "end\n",
      "foodstr"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 18,
       "text": [
        "{\"carrot\"=>\"orange\",\"lemon\"=>\"yellow\"}"
       ]
      }
     ],
     "prompt_number": 18
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.4: Traversing a Dict"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "foodstr = {\"carrot\"=>\"orange\", \"lemon\"=>\"yellow\", \n",
      "           \"apple\"=>\"green\", \"banana\"=>\"yellow\"}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 19,
       "text": [
        "{\"apple\"=>\"green\",\"carrot\"=>\"orange\",\"lemon\"=>\"yellow\",\"banana\"=>\"yellow\"}"
       ]
      }
     ],
     "prompt_number": 19
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for k in keys(foodstr)\n",
      "  println(\"$k $(foodstr[k])\")\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "apple green"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "carrot orange\n",
        "lemon yellow\n",
        "banana yellow\n"
       ]
      }
     ],
     "prompt_number": 20
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for (k,v) in collect(foodstr)\n",
      "   println(\"$k $v\")\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "apple green"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "carrot orange\n",
        "lemon yellow\n",
        "banana yellow\n"
       ]
      }
     ],
     "prompt_number": 21
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for (k,v) in sort(collect(foodstr))\n",
      "   println(\"$k $v\")\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "apple green"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "banana yellow\n",
        "carrot orange\n",
        "lemon yellow\n"
       ]
      }
     ],
     "prompt_number": 22
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "text = \"\"\"From: Jo\n",
      "To: Jim\n",
      "From: Jane\n",
      "\"\"\"\n",
      "infile = IOBuffer(text)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 23,
       "text": [
        "IOBuffer([0x46,0x72,0x6f,0x6d,0x3a,0x20,0x4a,0x6f,0x0a,0x54  \u2026  0x72,0x6f,0x6d,0x3a,0x20,0x4a,0x61,0x6e,0x65,0x0a],true,false,true,false,28,9223372036854775807,1)"
       ]
      }
     ],
     "prompt_number": 23
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "counts = Dict()\n",
      "for line in readlines(infile)\n",
      "    if line[1:6]==\"From: \"\n",
      "        name=chomp(line[7:end])\n",
      "        counts[name] = get(counts,name,0)+1\n",
      "    end\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 24
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for (name, count) in collect(counts)\n",
      "    println(\"$name $count\")\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Jo 1"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Jane 1\n"
       ]
      }
     ],
     "prompt_number": 25
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.5: Printing a Dict"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for (name, count) in collect(counts)\n",
      "    println(\"$name => $count\")\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Jo => 1"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "Jane => 1\n"
       ]
      }
     ],
     "prompt_number": 26
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "join([\"$k => $v\" for (k,v) in collect(counts)],'\\n')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 27,
       "text": [
        "\"Jo => 1\\nJane => 1\""
       ]
      }
     ],
     "prompt_number": 27
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(counts)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "{"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\"Jo\"=>1,\"Jane\"=>1}"
       ]
      }
     ],
     "prompt_number": 28
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "show(counts)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "{"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\"Jo\"=>1,\"Jane\"=>1}"
       ]
      }
     ],
     "prompt_number": 29
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.6: Retrieving from a Dict in Insertion Order"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#install OrderedCollections.jl ?"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 30
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# @@INCOMPLETE@"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 31
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.7: Dicts with multiple values per key"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "LOAD_PATH"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 36,
       "text": [
        "2-element Array{Union(ASCIIString,UTF8String),1}:\n",
        " \"C:\\\\Temp\\\\julia-rc4\\\\local\\\\share\\\\julia\\\\site\\\\v0.2\"\n",
        " \"C:\\\\Temp\\\\julia-rc4\\\\share\\\\julia\\\\site\\\\v0.2\"       "
       ]
      }
     ],
     "prompt_number": 36
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "multfood = [\"carrot\"=>[\"orange\",\"green\"], \n",
      "            \"lemon\"=>[\"yellow\",\"brown\"], \n",
      "            \"apple\"=>[\"green\",\"red\"], \n",
      "            \"banana\"=>[\"yellow\",\"brown\"] \n",
      "            ]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 32,
       "text": [
        "[\"apple\"=>[\"green\",\"red\"],\"carrot\"=>[\"orange\",\"green\"],\"lemon\"=>[\"yellow\",\"brown\"],\"banana\"=>[\"yellow\",\"brown\"]]"
       ]
      }
     ],
     "prompt_number": 32
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.8: Inverting a Dict"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "{v=>k for (k,v) in [(1,2),(3,4)]}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 33,
       "text": [
        "{4=>3,2=>1}"
       ]
      }
     ],
     "prompt_number": 33
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "surname = {\"Mickey\"=>\"Mantle\", \"Babe\"=>\"Ruth\"}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 34,
       "text": [
        "{\"Babe\"=>\"Ruth\",\"Mickey\"=>\"Mantle\"}"
       ]
      }
     ],
     "prompt_number": 34
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "first_name = {v=>k for (k,v) in collect(surname)}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 35,
       "text": [
        "{\"Ruth\"=>\"Babe\",\"Mantle\"=>\"Mickey\"}"
       ]
      }
     ],
     "prompt_number": 35
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(first_name[\"Mantle\"])"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Mickey"
       ]
      }
     ],
     "prompt_number": 36
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "color_dict = {\"Apple\"=>  \"red\",\n",
      "              \"Banana\"=> \"yellow\",\n",
      "              \"Lemon\"=>  \"yellow\",\n",
      "              \"Carrot\"=> \"orange\",\n",
      "             }"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 41,
       "text": [
        "{\"Banana\"=>\"yellow\",\"Lemon\"=>\"yellow\",\"Carrot\"=>\"orange\",\"Apple\"=>\"red\"}"
       ]
      }
     ],
     "prompt_number": 41
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "food_dict = {v=>k for (k,v) in collect(color_dict)}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 42,
       "text": [
        "{\"orange\"=>\"Carrot\",\"red\"=>\"Apple\",\"yellow\"=>\"Lemon\"}"
       ]
      }
     ],
     "prompt_number": 42
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "given = \"Apple\"\n",
      "if given in keys(color_dict)\n",
      "    println(\"$given is a food with color $(color_dict[given])\")\n",
      "elseif given in keys(food_dict)\n",
      "    println(\"$(color_dict[given]) is a food with color $given \")\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Apple is a food with color red"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n"
       ]
      }
     ],
     "prompt_number": 46
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "food_color"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 50,
       "text": [
        "[:Apple=>\"red\",:Raspberry=>\"pink\",:Carrot=>\"orange\",:Lemon=>\"yellow\",:Banana=>\"yellow\"]"
       ]
      }
     ],
     "prompt_number": 50
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "foods_with_color=Dict()\n",
      "for (food,color) in color_dict\n",
      "  if haskey(foods_with_color,color)\n",
      "    push!(foods_with_color[color], food)\n",
      "  else\n",
      "    foods_with_color[color] = [food]\n",
      "  end\n",
      "end\n",
      "foods_with_color"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 53,
       "text": [
        "{\"orange\"=>[\"Carrot\"],\"red\"=>[\"Apple\"],\"yellow\"=>[\"Banana\",\"Lemon\"]}"
       ]
      }
     ],
     "prompt_number": 53
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "println( join(foods_with_color[\"yellow\"], ' '), \" were yellow foods.\")"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Banana Lemon"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " were yellow foods.\n"
       ]
      }
     ],
     "prompt_number": 57
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "### PLEAC 5.9: Sorting a Dictionary"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for (f,c) in sort(collect(color_dict))\n",
      "    println(f,\" is \",c)\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Apple"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " is red\n",
        "Banana is yellow\n",
        "Carrot is orange\n",
        "Lemon is yellow\n"
       ]
      }
     ],
     "prompt_number": 64
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "function compare_length(x,y)\n",
      "    return length(string(x))<length(string(y))\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 73,
       "text": [
        "compare_length (generic function with 1 method)"
       ]
      }
     ],
     "prompt_number": 73
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for k in sort(collect(keys(color_dict)),lt=compare_length)\n",
      "    println(k,\" is \",color_dict[k])\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Lemon"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " is yellow\n",
        "Apple is red\n",
        "Banana is yellow\n",
        "Carrot is orange\n"
       ]
      }
     ],
     "prompt_number": 78
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "collect(keys(color_dict))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 76,
       "text": [
        "4-element Array{Any,1}:\n",
        " \"Banana\"\n",
        " \"Lemon\" \n",
        " \"Carrot\"\n",
        " \"Apple\" "
       ]
      }
     ],
     "prompt_number": 76
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for k in sort(collect(keys(color_dict)), by=length, rev=true)\n",
      "    println(k,\" is \",color_dict[k])\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Banana"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        " is yellow\n",
        "Carrot is orange\n",
        "Lemon is yellow\n",
        "Apple is red\n"
       ]
      }
     ],
     "prompt_number": 79
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.10: Merging Dictionaries"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "d1 = Dict((1,2,3),(4,5,6))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 89,
       "text": [
        "[2=>5,3=>6,1=>4]"
       ]
      }
     ],
     "prompt_number": 89
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "d2 = Dict((1,4),(7,8))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 90,
       "text": [
        "[4=>8,1=>7]"
       ]
      }
     ],
     "prompt_number": 90
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "merge(d1,d2)  #where a key is shared between d1 and d2, the result keeps the key-value pair from d2"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 92,
       "text": [
        "[4=>8,2=>5,3=>6,1=>7]"
       ]
      }
     ],
     "prompt_number": 92
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# food_color as per section 5.8\n",
      "drink_color = {\"Galliano\"=> \"yellow\",\n",
      "               \"Mai Tai\"=> \"blue\"}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 93,
       "text": [
        "{\"Galliano\"=>\"yellow\",\"Mai Tai\"=>\"blue\"}"
       ]
      }
     ],
     "prompt_number": 93
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "ingested_color = copy(drink_color)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 95,
       "text": [
        "{\"Galliano\"=>\"yellow\",\"Mai Tai\"=>\"blue\"}"
       ]
      }
     ],
     "prompt_number": 95
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "merge!(ingested_color, food_color)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 96,
       "text": [
        "{:Apple=>\"red\",:Raspberry=>\"pink\",:Carrot=>\"orange\",\"Galliano\"=>\"yellow\",\"Mai Tai\"=>\"blue\",:Lemon=>\"yellow\",:Banana=>\"yellow\"}"
       ]
      }
     ],
     "prompt_number": 96
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.11: Finding Common or Different Keys in Two Dictionaries"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "common = [k for k in intersect(keys(d1),keys(d2))]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 98,
       "text": [
        "1-element Array{Any,1}:\n",
        " 1"
       ]
      }
     ],
     "prompt_number": 98
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "this_not_that = [(k,d1[k]) for k in setdiff(keys(d1),keys(d2))]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 101,
       "text": [
        "2-element Array{(Any,Any),1}:\n",
        " (2,5)\n",
        " (3,6)"
       ]
      }
     ],
     "prompt_number": 101
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# citrus_color is a dict mapping citrus food name to its color.\n",
      "citrus_color = {\"Lemon\"=>  \"yellow\",\n",
      "                \"Orange\"=> \"orange\",\n",
      "                \"Lime\"=>   \"green\"}"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 102,
       "text": [
        "{\"Lime\"=>\"green\",\"Lemon\"=>\"yellow\",\"Orange\"=>\"orange\"}"
       ]
      }
     ],
     "prompt_number": 102
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# build up a list of non-citrus foods\n",
      "non_citrus = [ (k,color_dict[k]) for k in setdiff(keys(color_dict),keys(citrus_color)) ]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 105,
       "text": [
        "3-element Array{(Any,Any),1}:\n",
        " (\"Banana\",\"yellow\")\n",
        " (\"Carrot\",\"orange\")\n",
        " (\"Apple\",\"red\")    "
       ]
      }
     ],
     "prompt_number": 105
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.12: Dictionary references"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# @@INCOMPLETE@"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 106
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.13: Presizing a dictionary"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "mydict = Dict()\n",
      "sizehint(mydict, 100)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 107,
       "text": [
        "Dict{Any,Any}()"
       ]
      }
     ],
     "prompt_number": 107
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.14: Finding the most common anything"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "myarray = [1,2,4,5,3,4,7,8,4,3,2,5,5,7,8]\n",
      "count = Dict()\n",
      "for element in myarray\n",
      "    count[element] = get(count,element, 0) + 1\n",
      "end\n",
      "count"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 114,
       "text": [
        "{5=>3,4=>3,7=>2,2=>2,8=>2,3=>2,1=>1}"
       ]
      }
     ],
     "prompt_number": 114
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for element in myarray\n",
      "    print(element)\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "24534784325578"
       ]
      }
     ],
     "prompt_number": 110
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.15: Representing Relationships Between Data"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "father = {\"Cain\"=> \"Adam\",\n",
      "          \"Abel\"=> \"Adam\",\n",
      "          \"Seth\"=> \"Adam\",\n",
      "          \"Enoch\"=> \"Cain\",\n",
      "          \"Irad\"=> \"Enoch\",\n",
      "          \"Mehujael\"=> \"Irad\",\n",
      "          \"Methusael\"=> \"Mehujael\",\n",
      "          \"Lamech\"=> \"Methusael\",\n",
      "          \"Jabal\"=> \"Lamech\",\n",
      "          \"Tubalcain\"=> \"Lamech\",\n",
      "          \"Enos\"=> \"Seth\",\n",
      "         }"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 116,
       "text": [
        "{\"Methusael\"=>\"Mehujael\",\"Irad\"=>\"Enoch\",\"Mehujael\"=>\"Irad\",\"Lamech\"=>\"Methusael\",\"Enos\"=>\"Seth\",\"Tubalcain\"=>\"Lamech\",\"Abel\"=>\"Adam\",\"Enoch\"=>\"Cain\",\"Jabal\"=>\"Lamech\",\"Seth\"=>\"Adam\",\"Cain\"=>\"Adam\"}"
       ]
      }
     ],
     "prompt_number": 116
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#SKIP fileinput stuff\n",
      "# @@INCOMPLETE@"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 117
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "children=Dict()\n",
      "for (k, v) in collect(father)\n",
      "    if haskey(children,v)\n",
      "        push!(children[v],k)\n",
      "    else\n",
      "        children[v]=[k]\n",
      "    end\n",
      "end\n",
      "children"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 127,
       "text": [
        "{\"Methusael\"=>[\"Lamech\"],\"Irad\"=>[\"Mehujael\"],\"Adam\"=>[\"Abel\",\"Seth\",\"Cain\"],\"Mehujael\"=>[\"Methusael\"],\"Lamech\"=>[\"Tubalcain\",\"Jabal\"],\"Enoch\"=>[\"Irad\"],\"Seth\"=>[\"Enos\"],\"Cain\"=>[\"Enoch\"]}"
       ]
      }
     ],
     "prompt_number": 127
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "dd=Dict()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 118,
       "text": [
        "Dict{Any,Any}()"
       ]
      }
     ],
     "prompt_number": 118
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# RE on filenames skipped\n",
      "# Will not implement\n",
      "# @@INCOMPLETE@"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 128
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###PLEAC 5.16: Program dutree"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Will not implment\n",
      "# @@INCOMPLETE@"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 129
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      ";ipython nbconvert 5_pleac_dictionaries.ipynb"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stderr",
       "text": [
        "[NbConvertApp] Using existing profile dir: u'C:\\\\Users\\\\keithc\\\\.ipython\\\\profile_default'\r\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stderr",
       "text": [
        "[NbConvertApp] Converting notebook 5_pleac_dictionaries.ipynb to html\r\n",
        "[NbConvertApp] Support files will be in 5_pleac_dictionaries_files\\\r\n",
        "[NbConvertApp] Loaded template html_full.tpl\r\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stderr",
       "text": [
        "[NbConvertApp] Writing 268953 bytes to 5_pleac_dictionaries.html\r\n"
       ]
      }
     ],
     "prompt_number": 38
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}