CS 2120: Topic 8
================
Videos for this week:
^^^^^^^^^^^^^^^^^^^^^
.. raw:: html
.. raw:: html
Data Structures
^^^^^^^^^^^^^^^
.. image:: ../img/lists.png
:width: 300pt
* Data Structure = a particular structure which holds data
* Your first data structure is a ``list``
* Lists, although simple, are one of the most useful and powerful of all data structures.
.. admonition:: Question
:class: Note
How is a **data structure** different than a **data type**?
A *data type* is a set of values with certain properties/operations (ex: int, char, boolean among others). A *data structure* is a collection of various types of data organized into a particular format (ex: lists which are in the form [a, b, c, d, ...]).
What can we do with lists?
^^^^^^^^^^^^^^^^^^^^^^^^^^
* We can concatenate lists with the ``+`` operator::
>>> a=[5,7,9,10]
>>> b=['also','a','list']
>>> a+b
[5, 7, 9, 10, 'also', 'a', 'list']
* We can concatenate a list with itself, multiple times, using the ``*`` operator::
>>> a*3
[5, 7, 9, 10, 5, 7, 9, 10, 5, 7, 9, 10]
* We can *slice* lists::
>>> a[0:2]
[5,7]
>>> a[1:3]
[7,9]
* We can find a list's length::
>>> len(a)
4
* We can check if something is in a list::
>>> if 5 in a:
print("yes, 5 is in a!!!")
yes, 5 is in a!!!
* We can go through each list entry::
>>> for i in a:
print(i)
5
7
9
10
* We can create sequential lists with "range()"
>>> list(range(1,5))
[1, 2, 3, 4]
>>> list(range(5,10))
[5, 6, 7, 8, 9]
Mutability
^^^^^^^^^^^
* Strings are kind of like a "list of characters".. but recall that strings are **immutable**. What about lists?
* Let's try::
>>> a=[5,7,9,10]
>>> print(a)
[5, 7, 9, 10]
>>> a[2]='I changed!'
>>> print(a)
[5, 7, 'I changed!', 10]
* Lists, unlike strings, are **mutable**.
* A cleaner way to delete an element from a list is with the ``del`` statement::
>>> a=[5,7,9,10]
>>> a
[5, 7, 9, 10]
>>> del a[2]
>>> a
[5, 7, 10]
Aliasing
^^^^^^^^^
* What is this code doing?
>>> a=[1,2,3,4]
>>> print(a)
[1, 2, 3, 4]
>>> b=a
>>> b[2]='Z'
>>> print(a)
[1, 2, 'Z', 4]
* You might imagine that ``b`` is a *separate copy* of ``a``, so why does ``"Z"`` appear when you print ``a``?
* The code ``b=a`` creates an ``Alias`` for ``a`` called ``b``; in other words, we are saying that ``"b" is another name for "a"``.
.. warning::
In Python, when you "assign" a list, **you are not copying the list**. You are saying 'this is another name for the exact same list'.
* If you want to **copy** your list, use slicing: ``b = a[:]``. Slicing always creates a *new* list.
>>> a=[1,2,3,4]
>>> print(a)
[1, 2, 3, 4]
>>> b=a[:]
>>> b[2]='Z'
>>> print(a)
[1, 2, 3, 4]
Looping through lists
^^^^^^^^^^^^^^^^^^^^^
* Previously we used a for loop with ``in`` tp step through a list. ``for`` loops can also step through a list via an ``index`` (let's call it ``i``)::
>>> list=['a','b','c','d']
>>> for i in range(len(list)):
print(list[i])
a
b
c
d
* Often we'll want to print out the index with each list entry::
>>> list=['a','b','c','d']
>>> for i in range(len(list)):
print(i, list[i])
0 a
1 b
2 c
3 d
* This pattern is so common that Python has given us a built in function ``enumerate`` to do this::
for i in enumerate(list):
print i[0], i[1]
* ``i[0]`` is the index of the item in the list
* ``i[1]`` is the actual item itself
Using lists as parameters
^^^^^^^^^^^^^^^^^^^^^^^^^
* When you pass a list as an argument in a function, that function is called a *modifier* and the changes it makes are called *side effects*
* The function is not changing a copy of the list; rather, it is modifying the original (the list argument is an *alias*)
>>> def double(list):
""" Double each element of list """
for i in range(len(list)):
list[i] = 2 * list[i]
>>> myList = [2, 5, 9]
>>> print(myList)
[2, 5, 9]
>>> double(myList)
>>> print(myList)
[4, 10, 18]
Side effects
^^^^^^^^^^^^
* Any function which modifies a parameter is said to have ``side effects``
Pure functions
^^^^^^^^^^^^^^^
* If a function has no side effects, we call it a *pure function*.
Nested lists
^^^^^^^^^^^^^
* We can nest some number of lists inside other lists::
>>> listA = [a, b, c, d]
>>> listB = [1, 3, "horse"]
>>> listA.append(listB)
>>> print(listA)
[a, b, c, d, [1, 3, "horse"]]
* We can continue to nest lists inside of lists inside of lists... and so on.
For next class
^^^^^^^^^^^^^^^
* Look at the `NumPy Quickstart Tutorial `_ (just skim it)