Comprehensions Lab¶
Playing with Comprehensions¶
Goal:
Getting Familiar with list, set and dict comprehensions
List comprehensions¶
Note: this is a bit of a “backwards” exercise – we show you code, you figure out what it does.
As a result, not much to submit – don’t worry about it – you’ll have a chance to use these in other exercises.
>>> feast = ['lambs', 'sloths', 'orangutans',
'breakfast cereals', 'fruit bats']
>>> comprehension = [delicacy.capitalize() for delicacy in feast]
What is the output of:
>>> comprehension[0]
???
>>> comprehension[2]
???
(figure it out before you try it)
Filtering lists with list comprehensions¶
>>> feast = ['spam', 'sloths', 'orangutans', 'breakfast cereals',
'fruit bats']
>>> comp = [delicacy for delicacy in feast if len(delicacy) > 6]
What is the output of:
>>> len(feast)
???
>>> len(comp)
???
(figure it out first!)
Unpacking tuples in list comprehensions¶
>>> list_of_tuples = [(1, 'lumberjack'), (2, 'inquisition'), (4, 'spam')]
>>> comprehension = [ skit * number for number, skit in list_of_tuples ]
What is the output of:
>>> comprehension[0]
???
>>> len(comprehension[2])
???
Double list comprehensions¶
>>> eggs = ['poached egg', 'fried egg']
>>> meats = ['lite spam', 'ham spam', 'fried spam']
>>> comprehension = \
[ '{0} and {1}'.format(egg, meat) for egg in eggs for meat in meats]
What is the output of:
>>> len(comprehension)
???
>>> comprehension[0]
???
Set comprehensions¶
>>> comprehension = { c for c in 'aabbbcccc'}
What is the output of:
>>> comprehension
???
Dictionary comprehensions¶
>>> dict_of_weapons = {'first': 'fear',
'second': 'surprise',
'third':'ruthless efficiency',
'forth':'fanatical devotion',
'fifth': None}
>>> dict_comprehension = \
{ k.upper(): weapon for k, weapon in dict_of_weapons.items() if weapon}
What is the output of:
>>> 'first' in dict_comprehension
???
>>> 'FIRST' in dict_comprehension
???
>>> len(dict_of_weapons)
???
>>> len(dict_comprehension)
???
Other resources¶
See also:
https://github.com/gregmalcolm/python_koans/blob/master/python3/koans/about_comprehension.py
From Greg Malcolm’s excellent Python Koans series:
Count Even Numbers¶
This is from CodingBat “count_evens” (http://codingbat.com/prob/p189616)
Using a list comprehension, return the number of even integers in the given list.
Note: the % “mod” operator computes the remainder, e.g. 5 % 2
is 1.
count_evens([2, 1, 2, 3, 4]) == 3
count_evens([2, 2, 0]) == 3
count_evens([1, 3, 5]) == 0
Can you do this with a single line comprehension?
def count_evens(nums):
one_line_comprehension_here
dict
and set
comprehensions¶
Revisiting the dict/set lab – see how much you can do with comprehensions instead.
Specifically, look at these:
First a slightly bigger, more interesting (or at least bigger..) dict:
food_prefs = {"name": "Chris",
"city": "Seattle",
"cake": "chocolate",
"fruit": "mango",
"salad": "greek",
"pasta": "lasagna"}
Working with this dict:¶
Print the dict by passing it to a string format method, so that you get something like:
“Chris is from Seattle, and he likes chocolate cake, mango fruit, greek salad, and lasagna pasta”
Using a list comprehension, build a dictionary of numbers from zero to fifteen and the hexadecimal equivalent (string is fine). (the
hex()
function gives you the hexidecimal representation of a number as a string)Do the previous entirely with a dict comprehension – should be a one-liner
Using the dictionary from item (1): Make a dictionary using the same keys but with the number of ‘a’s in each value. You can do this either by editing the dict in place, or making a new one. If you edit in place make a copy first!
Create sets s2, s3 and s4 that contain numbers from zero through twenty, divisible 2, 3 and 4.
- Do this with one set comprehension for each set.
- What if you had a lot more than 3? – Don’t Repeat Yourself (DRY).
- create a sequence that holds all the divisors you might want – could be 2,3,4, or could be any other arbitrary divisors.
- loop through that sequence to build the sets up – so no repeated code. you will end up with a list of sets – one set for each divisor in your sequence.
- The idea here is that when you see three (Or more!) lines of code that are almost identical, then you you want to find a way to generalize that code and have it act on a set of inputs, so the actual code is only written once.
- Extra credit: do it all as a one-liner by nesting a set comprehension inside a list comprehension. (OK, that may be getting carried away!)