1.4. Python Basics III: Lists, Dictionaries, and Enumeration#
Reference: Chapters 2 and 5 of Computational Nuclear Engineering and Radiological Science Using Python, R. McClarren (2018)
1.4.1. Learning Objectives#
After studying this notebook, completing the activities, and asking questions in class, you should be able to:
Create lists with numeric and non-numeric items and add to a previously created list.
Enumerate a list using various syntax.
Create dictionaries with numeric and non-numeric key-value pairs and add to a previously created dictionary.
Enumerate a dictionary using various syntax.
1.4.2. Lists#
You can also do other fun stuff with for loops. For instance, you can have the control variable take on non-numeric things:
#silly hat code
hats = ["fedora","trilby","porkpie","tam o'shanter",
"Phrygian cap","Beefeaters' hat","sombrero"]
days = ["Monday","Tuesday","Wednesday","Thursday",
"Friday","Saturday","Sunday"]
count = 0
for today in hats:
print("It is",days[count],"and I will wear a",today)
count += 1
It is Monday and I will wear a fedora
It is Tuesday and I will wear a trilby
It is Wednesday and I will wear a porkpie
It is Thursday and I will wear a tam o'shanter
It is Friday and I will wear a Phrygian cap
It is Saturday and I will wear a Beefeaters' hat
It is Sunday and I will wear a sombrero
Notice what else we did here: we defined a list called days
that contained strings for the names of the days of the week. Inside our for
loop we had a numeric variable that kept track of what number the day of the week was (0 for Monday in this case). Then when we access days[count] it returns the string in position count.
We can go one step beyond and plan our wardrobe a month in advance using random numbers. The code below generates a random integer between 0 and 6:
import random
my_random_number = round(random.uniform(0,6))
print(my_random_number)
1
Home Activity
Modify the code below to loop over 30 days. For each day, randomly select which hat to wear.
#silly hat code
import random
hats = ["fedora","trilby","porkpie","tam o'shanter",
"Phrygian cap","Beefeaters' hat","sombrero"]
days = ["Monday","Tuesday","Wednesday","Thursday",
"Friday","Saturday","Sunday"]
# loop over 30 days
# Add your solution here
# randomly select a hat to wear
# Add your solution here
# print which day of the week it is and the hat choice
# Add your solution here
Lists are like vectors in MATLAB, except, as you can see above, we can store more than just numbers in them. We will talk about using a package numpy
to represent vectors and matrices in the NumPy notebook.
Home Activity
Fix the three examples below to count from 1 to 10.
## Attempt 1
N = [1, 2, 3, 4, 5, 6, 7, 11]
for i in range(len(N)):
print(i+1)
1
2
3
4
5
6
7
8
# Add your solution here
## Attempt 2
N = [1, 2, 3, 4, 5, 6, 7, 11]
for i in range(len(N)):
print(N[i])
1
2
3
4
5
6
7
11
# Add your solution here
## Attempt 3
for i in range(0,10):
print(i)
0
1
2
3
4
5
6
7
8
9
# Add your solution here
1.4.3. Dictionaries#
So far, we have used lists to store a sequence of numbers or more generally Python objects. Lists (and NumPy arrays - stay tuned) access elements by position and have an inherent ordering.
A dictionary is a set of key : value pairs. You can think of a dictionary as a fancy list that instead of accessing via the position, you access using a key.
#simple dictionary
days_of_week = {"M":"Monday", "T":"Tuesday",
"W":"Wednesday", "R":"Thursday",
"F":"Friday", "S":"Saturday",
"U":"Sunday"}
print("Key M gives", days_of_week["M"])
print("Key R gives", days_of_week["R"])
Key M gives Monday
Key R gives Thursday
Home Activity
Store the value for key F in the variable answer.
# Add your solution here
# Removed autograder test. You may delete this cell.
Calling days_of_week.keys()
returns a special list of the keys of the dictionary.
print(days_of_week.keys())
dict_keys(['M', 'T', 'W', 'R', 'F', 'S', 'U'])
We can also check if G
is a valid key for the dictionary.
print("G" in days_of_week.keys()) #is G a key in days_of_week?
False
Main idea: With dictionaries, we access elements using the key. In contrast, we access elements of strings, lists, and Numpy arrays using the position.
1.4.4. Example: Shopping List#
Home Activity
Create a dictionary to store the following shopping list. The keys should be the item names and the elements should be the quantity of the items.
1.5 bananas (pounds)
3 cans of soup
6 apples
2.3 pork tenderloin (pounds)
# Add your solution here
# Removed autograder test. You may delete this cell.
1.4.5. Another Example: Chemical Symbols and Element Names#
Below is code that parses ChemicalSymbols.csv
and stores the data in dictionary.
import csv
element_dict = {} #create a blank dictionary
# this block will only execute if the file opens
with open('https://raw.githubusercontent.com/ndcbe/data-and-computing/main/notebooks/data/ChemicalSymbols.csv') as csvfile:
chemreader = csv.reader(csvfile)
for row in chemreader: # have for loop that loops over each line
element_dict[row[0]] = row[1] # add a key:value pair
# Ask user to enter a chemical symbol
key = input("Enter a valid chemical symbol: ")
if key in element_dict:
print(key,"is",element_dict[key])
else:
print("Not a valid element")
K is Potassium
Home Activity
Run the code above twice. Try first with a valid chemical symbol. Then try with a chemical symbol not on the periodic table of elements.
We can also print out the dictionary.
print(element_dict)
{'Ac': 'Actinium', 'Ag': 'Silver', 'Al': 'Aluminium (Aluminum)', 'Am': 'Americium', 'Ar': 'Argon', 'As': 'Arsenic', 'At': 'Astatine', 'Au': 'Gold', 'B': 'Boron', 'Ba': 'Barium', 'Be': 'Beryllium', 'Bh': 'Bohrium', 'Bi': 'Bismuth', 'Bk': 'Berkelium', 'Br': 'Bromine', 'C': 'Carbon', 'Ca': 'Calcium', 'Cd': 'Cadmium', 'Ce': 'Cerium', 'Cf': 'Californium', 'Cl': 'Chlorine', 'Cm': 'Curium', 'Cn': 'Copernicium', 'Co': 'Cobalt', 'Cr': 'Chromium', 'Cs': 'Caesium (Cesium)', 'Cu': 'Copper', 'Db': 'Dubnium', 'Ds': 'Darmstadtium', 'Dy': 'Dysprosium', 'Er': 'Erbium', 'Es': 'Einsteinium', 'Eu': 'Europium', 'F': 'Fluorine', 'Fe': 'Iron', 'Fl': 'Flerovium', 'Fm': 'Fermium', 'Fr': 'Francium', 'Ga': 'Gallium', 'Gd': 'Gadolinium', 'Ge': 'Germanium', 'H': 'Hydrogen', 'He': 'Helium', 'Hf': 'Hafnium', 'Hg': 'Mercury', 'Ho': 'Holmium', 'Hs': 'Hassium', 'I': 'Iodine', 'In': 'Indium', 'Ir': 'Iridium', 'K': 'Potassium', 'Kr': 'Krypton', 'La': 'Lanthanum', 'Li': 'Lithium', 'Lr': 'Lawrencium', 'Lu': 'Lutetium', 'Lv': 'Livermorium', 'Md': 'Mendelevium', 'Mg': 'Magnesium', 'Mn': 'Manganese', 'Mo': 'Molybdenum', 'Mt': 'Meitnerium', 'N': 'Nitrogen', 'Na': 'Sodium', 'Nb': 'Niobium', 'Nd': 'Neodymium', 'Ne': 'Neon', 'Ni': 'Nickel', 'No': 'Nobelium', 'Np': 'Neptunium', 'O': 'Oxygen', 'Os': 'Osmium', 'P': 'Phosphorus', 'Pa': 'Protactinium', 'Pb': 'Lead', 'Pd': 'Palladium', 'Pm': 'Promethium', 'Po': 'Polonium', 'Pr': 'Praseodymium', 'Pt': 'Platinum', 'Pu': 'Plutonium', 'Ra': 'Radium', 'Rb': 'Rubidium', 'Re': 'Rhenium', 'Rf': 'Rutherfordium', 'Rg': 'Roentgenium', 'Rh': 'Rhodium', 'Rn': 'Radon', 'Ru': 'Ruthenium', 'S': 'Sulfur (Sulphur)', 'Sb': 'Antimony', 'Sc': 'Scandium', 'Se': 'Selenium', 'Sg': 'Seaborgium', 'Si': 'Silicon', 'Sm': 'Samarium', 'Sn': 'Tin', 'Sr': 'Strontium', 'Ta': 'Tantalum', 'Tb': 'Terbium', 'Tc': 'Technetium', 'Te': 'Tellurium', 'Th': 'Thorium', 'Ti': 'Titanium', 'Tl': 'Thallium', 'Tm': 'Thulium', 'U': 'Uranium', 'Uuo': 'Ununoctium', 'Uup': 'Ununpentium', 'Uus': 'Ununseptium', 'Uut': 'Ununtrium', 'V': 'Vanadium', 'W': 'Tungsten', 'Xe': 'Xenon', 'Y': 'Yttrium', 'Yb': 'Ytterbium', 'Zn': 'Zinc', 'Zr': 'Zirconium'}
element_dict
Show code cell output
{'Ac': 'Actinium',
'Ag': 'Silver',
'Al': 'Aluminium (Aluminum)',
'Am': 'Americium',
'Ar': 'Argon',
'As': 'Arsenic',
'At': 'Astatine',
'Au': 'Gold',
'B': 'Boron',
'Ba': 'Barium',
'Be': 'Beryllium',
'Bh': 'Bohrium',
'Bi': 'Bismuth',
'Bk': 'Berkelium',
'Br': 'Bromine',
'C': 'Carbon',
'Ca': 'Calcium',
'Cd': 'Cadmium',
'Ce': 'Cerium',
'Cf': 'Californium',
'Cl': 'Chlorine',
'Cm': 'Curium',
'Cn': 'Copernicium',
'Co': 'Cobalt',
'Cr': 'Chromium',
'Cs': 'Caesium (Cesium)',
'Cu': 'Copper',
'Db': 'Dubnium',
'Ds': 'Darmstadtium',
'Dy': 'Dysprosium',
'Er': 'Erbium',
'Es': 'Einsteinium',
'Eu': 'Europium',
'F': 'Fluorine',
'Fe': 'Iron',
'Fl': 'Flerovium',
'Fm': 'Fermium',
'Fr': 'Francium',
'Ga': 'Gallium',
'Gd': 'Gadolinium',
'Ge': 'Germanium',
'H': 'Hydrogen',
'He': 'Helium',
'Hf': 'Hafnium',
'Hg': 'Mercury',
'Ho': 'Holmium',
'Hs': 'Hassium',
'I': 'Iodine',
'In': 'Indium',
'Ir': 'Iridium',
'K': 'Potassium',
'Kr': 'Krypton',
'La': 'Lanthanum',
'Li': 'Lithium',
'Lr': 'Lawrencium',
'Lu': 'Lutetium',
'Lv': 'Livermorium',
'Md': 'Mendelevium',
'Mg': 'Magnesium',
'Mn': 'Manganese',
'Mo': 'Molybdenum',
'Mt': 'Meitnerium',
'N': 'Nitrogen',
'Na': 'Sodium',
'Nb': 'Niobium',
'Nd': 'Neodymium',
'Ne': 'Neon',
'Ni': 'Nickel',
'No': 'Nobelium',
'Np': 'Neptunium',
'O': 'Oxygen',
'Os': 'Osmium',
'P': 'Phosphorus',
'Pa': 'Protactinium',
'Pb': 'Lead',
'Pd': 'Palladium',
'Pm': 'Promethium',
'Po': 'Polonium',
'Pr': 'Praseodymium',
'Pt': 'Platinum',
'Pu': 'Plutonium',
'Ra': 'Radium',
'Rb': 'Rubidium',
'Re': 'Rhenium',
'Rf': 'Rutherfordium',
'Rg': 'Roentgenium',
'Rh': 'Rhodium',
'Rn': 'Radon',
'Ru': 'Ruthenium',
'S': 'Sulfur (Sulphur)',
'Sb': 'Antimony',
'Sc': 'Scandium',
'Se': 'Selenium',
'Sg': 'Seaborgium',
'Si': 'Silicon',
'Sm': 'Samarium',
'Sn': 'Tin',
'Sr': 'Strontium',
'Ta': 'Tantalum',
'Tb': 'Terbium',
'Tc': 'Technetium',
'Te': 'Tellurium',
'Th': 'Thorium',
'Ti': 'Titanium',
'Tl': 'Thallium',
'Tm': 'Thulium',
'U': 'Uranium',
'Uuo': 'Ununoctium',
'Uup': 'Ununpentium',
'Uus': 'Ununseptium',
'Uut': 'Ununtrium',
'V': 'Vanadium',
'W': 'Tungsten',
'Xe': 'Xenon',
'Y': 'Yttrium',
'Yb': 'Ytterbium',
'Zn': 'Zinc',
'Zr': 'Zirconium'}
1.4.6. Dictionary of Dictionaries#
We can make dictionaries even more powerful if we make a dictionary of dictionaries.
Top Level. Day of the week.
Key: symbol “M”, “T”, etc.
Value: Another dictionary!
Second Level. Data for each day.
Keys: “name”, “weekday”, “weekend”
Values: string, boolean (True or False), boolean
#simple dictionary of dictionaries
days_of_week = {"M":{"name":"Monday","weekday":True,"weekend":False},
"T":{"name":"Tuesday","weekday":True,"weekend":False},
"W":{"name":"Wednesday","weekday":True,"weekend":False},
"R":{"name":"Thursday","weekday":True,"weekend":False},
"F":{"name":"Friday","weekday":True,"weekend":False},
"S":{"name":"Saturday","weekday":False,"weekend":True},
"U":{"name":"Sunday","weekday":False,"weekend":True}}
print("The days that are weekdays are")
for day in days_of_week: #for loop over dictionary, loops over keys
if days_of_week[day]["weekday"] == True:
print(days_of_week[day]["name"],"is a weekday.")
print("The days that are weekend days are")
for day in days_of_week: #for loop over dictionary, loops over keys
if days_of_week[day]["weekend"] == True:
print(days_of_week[day]["name"],"is a weekend, whoop.")
The days that are weekdays are
Monday is a weekday.
Tuesday is a weekday.
Wednesday is a weekday.
Thursday is a weekday.
Friday is a weekday.
The days that are weekend days are
Saturday is a weekend, whoop.
Sunday is a weekend, whoop.
Notice that when you loop over a dictionary in a for loop, the loop variable will get each of the keys of the dictionary.
The dictionary has been modified to include the day name in Spanish.
#more complicated dictionary of dictionaries
days_of_week2 = {"M":{"name":"Monday","weekday":True,"Spanish":"Lunes"},
"T":{"name":"Tuesday","weekday":True,"Spanish":"Martes"},
"W":{"name":"Wednesday","weekday":True,"Spanish":"Miércoles"},
"R":{"name":"Thursday","weekday":True,"Spanish":"Jueves"},
"F":{"name":"Friday","weekday":True,"Spanish":"Viernes"},
"S":{"name":"Saturday","weekday":False,"Spanish":"Sábado"},
"U":{"name":"Sunday","weekday":False,"Spanish":"Domingo"}}
Class Activity
With a partner, write pseudocode to loop over the days of the week. Print off the day name in Spanish and whether it is a weekend or weekday.
Class Activity
Implement your pseudocode in Python.
# Add your solution here
1.4.7. Enumerate#
1.4.8. Lists#
Let’s see some syntax for growing lists.
# create a list with nothing
students = []
# add a student
students.append("Joe Smith")
# add another student
students.append("Jane Doe")
print(students)
['Joe Smith', 'Jane Doe']
How to loop over the list? Let’s review.
# Approach 1
for s in students:
print(s)
Joe Smith
Jane Doe
# Approach 2
for i in range(len(students)):
print(i,": ",students[i])
0 : Joe Smith
1 : Jane Doe
Can we simply the syntax? It is really convienent to access the index with i
and the student with s
.
for i, s in enumerate(students):
print(i,": ",s)
0 : Joe Smith
1 : Jane Doe
1.4.9. Dictionaries#
How about adding key-value pairs to a dictionary? Let’s take a look.
# create a dictionary with nothing
pantry = {}
# add a pantry item and quantity
pantry["pasta"] = 3
# add another pantry item and quantity
pantry["green beans"] = 4
print(pantry)
{'pasta': 3, 'green beans': 4}
If the key already exists in the dictionary, it will update with the newly assigned value rather than add another pair.
pantry["pasta"] = 2
print(pantry)
{'pasta': 2, 'green beans': 4}
How do we loop over the dictionary? Here it is again.
# to print out just the keys
for k in pantry.keys():
print(k)
pasta
green beans
# to print out just the values
for v in pantry.values():
print(v)
2
4
# to print out the key-value pairs together
for food in pantry:
print(food, ":", pantry[food])
pasta : 2
green beans : 4