{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Sets and Tuples\n", "\n", "Sets are so important in programming that the designers of Python decided that they need to be a native data structure of the language, much like lists and dictionaries.\n", "\n", "Let's see what we can do with sets!\n", "\n", "First, let's create an empty set:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "{'a', 'b'}\n" ] } ], "source": [ "s = {'a', 'b'}\n", "print(type(s))\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We can create the same set by adding elements to the empty set:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'a', 'b'}\n" ] } ], "source": [ "s = set()\n", "s.add('a')\n", "s.add('b')\n", "print(s)\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Next, let's see what would happen if we add an element that's already there:\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'a', 'b'}\n" ] } ], "source": [ "s.add('a')\n", "print(s)\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Order doesn't matter in sets:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "{'c','a', 'b'} == {'a', 'b', 'c'}" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "You can also create a set from a list of elements:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "basket = {['apple', 'orange', 'apple', 'pear', 'orange', 'banana']}" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This is the same as:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Checking for membership is performed using the ```in``` operator:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "print('orange' in basket)\n", "print('kiwi' in basket)\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The ```in``` operator works for lists as well:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']\n", "print('orange' in basket)\n", "print('kiwi' in basket)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Which one do you think is faster?" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "All the standard set operations that would expect are available:\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'c', 'a', 'b', 'd', 'r'} {'c', 'a', 'z', 'm', 'l'}\n", "{'c', 'a', 'd', 'm', 'r', 'z', 'l', 'b'}\n", "{'c', 'a'}\n", "{'r', 'b', 'd'}\n", "{'d', 'm', 'r', 'z', 'l', 'b'}\n" ] } ], "source": [ "a = set('abracadabra')\n", "b = set('alacazam')\n", "print(a, b)\n", "\n", "print(a | b)\n", "print(a & b)\n", "print(a - b)\n", "print(a ^ b)\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "These operators are also available as methods:\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'c', 'a', 'd', 'm', 'r', 'z', 'l', 'b'}\n", "{'c', 'a'}\n", "{'r', 'b', 'd'}\n", "{'d', 'm', 'r', 'z', 'l', 'b'}\n", "{'c', 'a', 'b', 'd', 'r'} {'c', 'a', 'z', 'm', 'l'}\n" ] } ], "source": [ "a = set('abracadabra')\n", "b = set('alacazam')\n", "print(a, b)\n", "\n", "print(a.union(b))\n", "print(a.intersection(b))\n", "print(a.difference(b))\n", "print(a.symmetric_difference(b))\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "These operations return a new set and leave the set a unchanged." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "You can also test whether a set is a subset of another:\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n", "False\n", "False\n", "False\n" ] } ], "source": [ "print(a < b)\n", "print(a <= b)\n", "print(a.issubset(b))\n", "print(a.issuperset(b))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Set elements must be hashable (same as dictionary keys). \n", "Can you guess why? Therefore the following will give an error:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sets are not hashable!\n" ] } ], "source": [ "try :\n", " s = set(['a', set('b')])\n", "except :\n", " print (\"sets are not hashable!\")" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "But there is a workaround, using ```frozenset```:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n", "True\n", "True\n" ] } ], "source": [ "s = set(['a', frozenset('b')])\n", "print('b' in s)\n", "print('a' in s)\n", "print(frozenset('b') in s)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Tuples\n", "\n", "A **tuple** is a sequence of values much like a list. \n", "The important difference is that tuples are immutable, and hence can be used as keys for a dictionary.\n", "\n", "A tuple can be created as a comma-separated list of values:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "'a'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t=tuple(('a', 5.0, 10))\n", "t[0]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "577412586303046870" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "tuples are immutable - you can't do this!\n" ] } ], "source": [ "t = ('a', 'b')\n", "hash(t)\n", "try :\n", " t[0] = 'z'\n", "except :\n", " print (\"tuples are immutable - you can't do this!\")" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "One of the useful things about tuples is for returning multiple values from a function:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('first', 'second') \n" ] } ], "source": [ "def returns_two_values() :\n", " return 'first', 'second'\n", "return_value = returns_two_values()\n", "\n", "print (return_value, type(return_value))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Tuples can be keys of a dictionary:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "{('a', 1): 3}" ] } ], "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.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }