### CS51A - Spring 2019 - Class 7

#### Example code in this lecture

scores-lists.py
more-lists.py

#### Lecture notes

- assignment 2

• quick list recap
- lists are a data structure that allows us to store multiple things in a single variable
- we create a new list using [], e.g.
>>> l = [100, 10, 1, 2, 5]
>>> l
[100, 10, 1, 2, 5]

- the items in the list are ordered sequentially and we can access them by indexing into the list

>>> l[0]
100
>>> l[3]
2

The first item in the list is at index 0, second at index 1, ...

- We can also index from the back using negative numbers
>>> l[-1]
5

- We can get a sublist, by slicing

>>> l[0:2]
[100, 10]
>>> l[1:4]
[10, 1, 2, 5]

You specify a start:end range and you get back a *new* list including the data starting at start index up through, but *not* including end

• looping over lists
- We can use the for loop to iterate over each item in the list:

>>> my_list = [4, 1, 8, 10, 11]
>>> for value in my_list:
...    print(value)
...
4
1
8
10
11

- This is often called a "foreach" loop, i.e. for each item in the list, do an iteration of the loop

• write a function call sum that sums up the values in a list of numbers

def sum(numbers):
total = 0

for val in numbers:
total += val

• back to our stats program... how could we write average given what we know so far, that is a function that takes a list as a parameter and calculates the average?
- look at the inelegant_average function in scores-lists.py code
- loop over each of the elements in the list
- accumulate a sum
- accumulate a count
- divide the sum by the count
- look at the average function in scores-lists.py code

• built-in functions over lists: there are also some built-in functions that take a list as a parameter
- we can get the length of a list
>>> len(l)
3
>>> len([1, 2, 3, 4, 5])
5
>>> len([])
0
- max
>>> l = [5, 3, 2, 1, 10]
>>> max(l)
10

- min
>>> min(l)
1
- sum
>>> sum(l)
21

• lists are objects and therefore have methods. Any guesses?
- append: add a value on to the end of the list
>>> my_list = [15, 2, 1, 20, 5]
>>> my_list.append(100)
>>> my_list
[15, 2, 1, 20, 5, 100]

- notice that append does NOT return a new list, it modifies the existing list!

- We can look at the documentation do see what is available
http://docs.python.org/tutorial/datastructures.html

- pop: remove a value off of the end of the list and return it
>>> my_list.pop()
100
>>> my_list
[15, 2, 1, 20, 5]

- notice that it both modifies the list and returns a value
- if you want to use this value, you need to store it!
>>> x = my_list.pop()
>>> x
5
- pop also has another version where you can specify the index

>>> my_list = [15, 2, 1, 20, 5]
>>> my_list.pop(2)
1
>>> my_list
[15, 2, 20, 5]
- insert: inserts a value at a particular index
>>> my_list = [15, 2, 1, 20, 5]
>>> my_list.insert(2, 100)
>>> my_list
[15, 2, 100, 1, 20, 5]

- again, lists are mutable, so insert does not return a new list, but modifies the underlying one
- sort
>>> my_list = [15, 2, 1, 20, 5]
>>> my_list.sort()
>>> my_list
[1, 2, 5, 15, 20]
>>> my_list = ["these", "are", "some", "words", "to", "sort"]
>>> ["these", "are", "some", "words", "to", "sort"].sort()
>>> my_list = ["these", "are", "some", "words", "to", "sort"]
>>> my_list.sort()
>>> my_list
['are', 'some', 'sort', 'these', 'to', 'words']

• back to our grades program: look at scores-lists.py code
- there is a function called get_scores. That gets the scores and returns them as a list. How?
- starts with an empty list
- uses append to add them on to the end of the list
- returns the list when the loop finishes
- median function
- sorts the values
- notice again that sort does NOT return a value, but sorts the list that it is called on
- returns the middle entry

• lists are mutable
- what does that mean?
- we can change (or mutate) the values in a list

- notice that many of the methods that we call on lists change the list itself

- we can mutate lists with methods, but we can also change particular indices

>>> my_list = [15, 2, 1, 20, 5]
>>> my_list
[15, 2, 1, 20, 5]
>>> my_list[2] = 100
>>> my_list
[15, 2, 100, 20, 5]

• sequences
- lists are part of a general category of data structures called sequences that represent a sequence of things
- *all* sequences support a number of shared behavior
- the ability to index using []
- the ability to slice using [:]
- a number of built-in functions:
- len
- max
- min
- the ability to iterate over in with a for loop
- We've actually seen one other sequence?
- strings!

• strings as sequences
- notice that we can do all the sequence-like things with strings
>>> s = "banana"
>>> s[4]
'n'
>>> s[2:5]
'nan'
>>> len(s)
6
>>> for letter in s:
... print letter

b
a
n
a
n
a
- strings, however, are immutable
>>> s[4] = "c"
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
TypeError: 'str' object does not support item assignment

- no matter how hard you try, you cannot mutate a string

• What does the list_to_string function do in more-lists.py code?
- takes as input a list
- what is the type of the list?
- a list of almost anything!
- anything that we can call str() on (which turns out to be lots of things)
- concatenates all the items in the list into a single string
- results starts out as the empty string
- it iterates through each item in the list and concatenates them on to the results
- this is similar to our example before of summing up all the numbers in a list