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)
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 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 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)
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(",")
zip