# Lists

{% embed url="<https://youtu.be/5zwRU79pX3A>" %}

&#x20;[Data Structures](http://python.swaroopch.com/data_structures.html)

## Lists

Everyone knows what a list is right? We have TODO lists, word lists, homework lists. They are everywhere. Well, they are in computers too. Lists help us organize values we might be interested in into a single collection. We can then perform operations on each element of the list and add or delete items. In Python we can create a list by doing the following:

```python
my_list = [1, 2, 3]
```

We store lists in variables like we have been doing with integers and strings. The syntax has us encapsulate or surround the values with square brackets.

&#x20;*Try creating your own list with the following values:* *`1,`* *`"2",`* *`"three", [4]]`* *and then print out the list!*

Some languages enforce that lists only hold values of the same type (e.g. integers *only* or strings *only*). Python doesn't care as much. Some people view this positively and some view this negatively. It is definitely nice to have all of the flexibility you want when coding but sometimes it can introduce sneaky bugs that are difficult to track down. Whether you like it or don't like it, you should be careful when doing things like I just had you do.

To get the values out of a list we have created we do the following:

```python
my_list[1]
```

This will give us the value of `2`. What!? Shouldn't it be `1`? Nope. The answer is `2` because in computers we almost always start at an index of `0`. The word I used here is *index* which refers to the action of finding an object. If you went to a library and wished to get a book, you would look up the book's index which would lead you to where it is on a shelf. The same concept applies to indexes (or indices) in a list. The index is the item's position in the list. We use those square brackets after the variable name to tell Python that we wish to index the list at the desired position.

Python allows us to do some cool things with lists. One of these is the ability to index a list from the back instead of the front. This is called a negative index and when performed on our list would give us the value of `3`.

```python
my_list[-1]
```

We can also create sublists from existing lists. This is called slicing. It looks just like indexing but we supply two values instead of one.

```python
my_list = ['a', 'b', 'c', 'd', 'e', 'f']
list_1 = my_list[:3]   # ['a', 'b', 'c']
list_2 = my_list[1:5]  # ['b', 'c', 'd', 'e']
list_3 = my_list[3:]   # ['d', 'e', 'f']
```

We have used the `len()` function with strings but it can also be used with lists to determine how many objects are in lists.

```python
len(['a', 'b', 'c']) == 3
```

## More Operators and Member Functions

We have seen certain keywords already but certain keywords have different meanings when applied to lists. The `in` keyword was used previously in a `for` loop. When used with lists we can have Python tell us if a specific value exists within the list.

```python
'c' not in ['a', 'b', 'd', 'e'] == True
```

We can also use some of our familiar operators with lists. We can concatenate (combine) two lists together with the `+` operator.

```python
['a', 'b', 'c'] + ['d', 'e', 'f']  # ['a', 'b', 'c', 'd', 'e', 'f']
```

We can also combine things together multiple times using the `*` operator.

```python
['a', 'b', 'c'] * 3   # ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
```

There might be a time when you want to set multiple values from a list at the same time. Python allows you to do this with multiple assignment.

```python
name, height, age = [ 'reed', 71, 26 ]
```

This is all really cool but how do you add things to a list when the program is running? Lists have functions that you can call *on* them. This means that when you have a list like: `my_list = [1, 2, 3]` you can call functions on `my_list`. We call these *member functions* because they are *members* of List.

### append()

```python
my_list = ['a', 'b', 'c']
my_list.append('d')  # ['a', 'b', 'c', 'd']
```

### insert()

```python
my_list.insert(2, 'z')  # ['a', 'b', 'z', 'c', 'd']
```

### index()

```python
my_list.index('b') == 1  # True
```

### remove()

```python
my_list.remove('c')  # ['a', 'b', 'z', 'd']
```

### sort()

```python
my_list = [4, 2, 3, 5, 1]
my_list.sort()  # [1, 2, 3, 4, 5]

my_list = [ 4, 6, 1, 'reed', 'britney' ]
my_list.sort()  # oops!

# check out ASCII values for why the following list sorts funny
my_list = [ 'Reed', 'britney', 'gary', 'Zeke' ]
my_list.sort()  # [ 'Reed', 'Zeke', 'britney', 'gary']
```

&#x20;*Try sorting the list we created earlier* *`[1,`* *`"2",`* *`"three", [4]]`!*

You should have found an error when trying to sort. That is because Python doesn't know how to sort values of different types. This is the trouble I mentioned you can get into if you create lists with different types. Python gives you some flexibility to do what you want but sometimes that flexibility might make things challenging in the future.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://programming.reedcwilson.com/lesson-2/lists.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
