# Practice

## Comprehensions

Let’s practice our comprehensions. Create a list of only odd numbers between 0 and 100 using a list comprehension. Then, use a comprehension to create a dictionary where the keys are the even numbers from your list, and the values are random integers between 0 and 100 (hint: try `random.randint(min, max)`). Finally, use a comprehension to create a set of every unique value from the above dictionary.

``````>>> my_list = [num for num in range(0, 100) if num % 2 == 0]
>>> print(my_list)

>>> import random
>>> my_dict = {num:random.randint(0, 100) for num in my_list}
>>> print(my_dict)

>>> my_set = {num for num in my_dict.values()}
>>> print(my_set)
``````

### Slicing

Let’s play with slices. How do we get the last two elements of our list?

``````>>> my_list = ["h", "e", "l", "l", "o", "!"]
>>> len(my_list)
# So the last two indexes are 4 and 5. Since the first number in the slice is inclusive, and the second number is exclusive, we can ask for everything between index 4 and 6
>>> my_list[4:6]
# We can also say "Give me everything after index 4
>>> my_list[4:]
# Or, we can ask for just the last two items without caring how big the list is. This means "give me everything starting from two before the end":
>>> my_list[-2:]
``````

You know how to create a list of even or odd numbers with a list comprehension. Make a list of numbers between 0 and 100, then try making a list of even numbers between 30 and 70, by taking a slice from the first list. Then, make a new list in the reverse order.

``````>>> my_list = [num for num in range(0, 100)]
>>> my_slice = my_list[30:70:2]
>>> print(my_slice)
>>> my_backwards_slice = my_slice[::-1]
>>> print(my_backwards_slice)
``````

### `zip`

Make a list of all the names you can think of, called “names”. Make a second list of numbers, called “scores”, using a list comprehension and `random.randint(min, max)` as before. Use the first list in your comprehension to make it the same length. Then, use `zip()` to output a simple scoreboard of one score per name.

``````>>> names = ["Nina", "Max", "Floyd", "Lloyd"]
>>> scores = [random.randint(0, 100) for name in names]
>>> scores
[41, 38, 96, 81]
>>> for name, score in zip(names, scores):
...     print(f"{name} got a score of {score}")
...
``````

## Converting Between Types

Converting between types in Python is one of the most powerful language features.

You can quickly convert between strings, numbers, and various data-types to supercharge quickly solving problems. You can even use powerful data structures like sets to your advantage.

### Converting Between Numbers and Strings

Converting between numbers and strings is easy with `str()` and `int()`:

``````>>> my_string = str(100)
>>> my_string
>>> type(my_string)
>>> my_int = int(my_string)
>>> my_int
>>> type(my_int)
``````

You can also use `float()` to convert strings into floating point numbers:

``````>>> float("3.1415")
3.1415
``````

Bonus tip: `int()` works great for converting floats as well, as long as you don’t care about the mantissa (the part after the decimal point):

``````>>> int(3.1415)
``````

### Converting Between Lists and Strings

A `str`ing can be considered as just a list of characters, so converting back and forth is easy:

``````>>> my_list = list("hello")
>>> my_list
>>> str(my_list)
``````

Oops, that wasn’t quite what we wanted. Running any object through `str()` will usually return a literal string of that object. What we want is to join the elements of the list (into a string). We can do that using string’s built-in `join()` method. In this case, we’ll use an empty string:

``````>>> ''.join(my_list)
# Note: we can use any string we want to join the characters!
>>> ','.join(my_list)
>>> '-'.join(my_list)
``````

Another common way of converting a string into a list is with the string’s `split()` method. This is useful for lightweight parsing of, for example, CSV (comma separated value) data.

``````>>> my_string = "the,quick,brown,fox"
>>> my_string.split(",")
``````

## Solutions

### Comprehensions

Here's what you should have seen in your REPL:

### Slicing

Here's what you should have seen in your REPL:

### `zip`

Here's what you should have seen in your REPL:

### Converting Between Types

#### Converting Between Numbers and Strings

Here's what you should have seen in your REPL:

#### Converting Between Lists and Strings

Here's what you should have seen in your REPL: