In this module you will learn about another data structure called dictionaries which can be used to store information using 'keys' rather than integer based indexes.
A Dictionary is another helpful iterable data structure that is built-in to Python. In a natural language, a dictionary has a series of terms and each term has a definition. A Python dictionary isn't much different, but instead of "terms" we call them "keys" and instead of "definitions" we call them "values" or "data." In that sense a dictionary is a set of mappings from specific keys to specific values. The one difference between a natural language dictionary and a Python dictionary is that a Python dictionary is unordered. That means that unlike a list which has a set order, the order of items in a dictionary is undetermined.
Dictionaries can be incredibly useful if we want to store data and look that data up by name instead of using an index. Unlike the List sequence structure which uses an integer index to lookup values (and maintains the order of the list), a dictionary uses immutable objects (usually strings) called a key to find a specific value.
You can create either empty dictionaries or dictionaries with items already in the dictionary. To create an empty dictionary we use the syntax { }
or dict()
. To create a new populated dictionary we can use the form { KEY_1: VALUE_1, KEY_2: VALUE_2, ..., KEY_N: VALUE_N }
. Here are a few examples:
# Creating an empty dictionary students = { } # key - a student ID, value - name of the student # Creating a dictionary with two entries (key-value pairs). # In this case, the dictionary is of students, where the key is the # student ID and the value is the name of the student students = { "N12345678": "Andrew Case", "N87654321": "Bruce Wayne" }
You can access an element's value by simply using the syntax DICTIONARY_NAME[KEY]
. So we can print()
each student in our student dictionary defined above using:
print("Student: " + students["N12345678"]) print("Student: " + students["N87654321"])
Which results in the output:
Student: Andrew Case Student: Bruce Wayne
Sample Program: In this sample program, we create a dictionary of technical words and allow the user to lookup the definitions for these words from the dictionary.
To insert or replace an item in the dictionary the form is
DICTIONARY_NAME[KEY]
= VALUE
. For example:
students = dict() # Create an empty dictionary students["N12345678"] = "Andrew Case" # Add students to dictionary students["N87654321"] = "Bruce Wayne" students["N99999999"] = "Clark Kent"If the item for that key doesn't exist, a new item will be created. If an item already exists for that key, the value will be overwritten with the new value.
You can check if an element's value exists in a list using the form KEY in DICTIONARY_NAME
like so:
if "N12345678" in students: print(students["N12345678"])Output:
Andrew Case
Use the del
keyword followed by the item to delete. The form is del DICTIONARY_NAME[KEY]
like so:
del students["N12345678"]
Remember that the keys are immutable, so you can't change a key for an entry, but you can replace the value that is being referenced by a specific key. For example, let's say that "Bruce Wayne" wanted to officially change his name to "Batman." We could do so using the same method that we used to insert the original value:
students["N99999999"] = "Superman"
To iterate through each key and use that to pull each value we use the DICTIONARY_NAME.keys()
function to get a sequence of keys for that dictionary. Here's an example of how we can iterate over each key:
for key in students.keys(): print(key)Output:
N99999999 N87654321
To iterate through each value we use DICTIONARY_NAME.values()
function to get a sequence of all values in that dictionary. Here's an example:
for value in students.values(): print(value)Output:
Superman Bruce Wayne
To iterate through each key-value pair we use the DICTIONARY_NAME.items()
function to get both the key and value of each item in that dictionary. Here's an example:
for key, value in students.items(): print(key, "->", value)Ouptut:
N99999999 -> Superman N87654321 -> Bruce Wayne
Lists | Dictionaries | |
---|---|---|
Ordered? | ordered by index | unordered |
Lookup item using: | numeric index | unique key |
Duplicate values allowed: | ✓ | ✓ |
To determine which data structure you should probably use, a basic approach is to follow these rules (there are times when these rules should be broken for performance reasons, but that is beyond the scope of this section):
Sample Program: The following program repeatedly asks the user to enter a name. Once the user enters a blank name, it then prints the total number of times each name was entered.
Like lists, dictionaries are objects which have methods that can run on any dictionary that has been created. Below are some of the most commonly used methods. You can get a list of all the dictionary methods by running help(dict)
in a Python shell, or you can visit the Python API for a complete list.
You can use the same built-in len()
function that works with lists to also get the length of a dictionary. In this case the syntax is len(DICTIONARY_NAME)
which returns the number of items in the dictionary provided. Here is an example:
students = { "N12345678": "Andrew Case", "N87654321": "Bruce Wayne" } print("Number of items:", len(students))Output:
Number of items: 2
In addition to the syntax DICTIONARY_NAME[KEY]
to get a value
(which could error if the key doesn't exist), there is a method you can use to
avoid getting a possible KeyError
. DICTIONARY_NAME.get(key[,
default])
returns the value for key
if key
is
in the dictionary, else default
. If default
is not
given, it defaults to None
. Here is an example:
students = { "N12345678": "Andrew Case", "N87654321": "Bruce Wayne" } print(students.get("N12345678")) print(students.get("N11111111"))Output:
Andrew Case None
Sometimes you may want to lookup what keys are stored in the dictionary. To do that you'll use the DICTIONARY_NAME.keys()
method. This method will return a list data structure where each item in the list is one of the keys from the dictionary. Here's an example:
students = { "N12345678": "Andrew Case", "N87654321": "Bruce Wayne" } # Get all the studentIDs (the keys) student_IDs = students.keys() # Print all the studentIDs for student_ID in student_IDs: print("ID:", student_ID)Output:
ID: N87654321 ID: N12345678
Note: Since a dictionary is unordred, the order of the returned items is arbitrary.
Other times, you may just want to get a list of all the values stored in a dictionary. To do that you'll use the DICTIONARY_NAME.values()
method:
students = { "N12345678": "Andrew Case", "N87654321": "Bruce Wayne" } # Get all student names (values in the dictionary) student_names = students.values() # Print all the students one at a time for student in student_names: print("Student:", student)Output:
Student: Bruce Wayne Student: Andrew Case
Often we may want to remove an item from the dictionary to do some sort of processing on it. Instead of getting the item and then deleting it, we can do so with the pop() method. DICTIONARY_NAME.pop(key[, default])
returns the value for key
and removes the item if it exists, otherwise default
is returned. If default
is not specified and key
is not in the dictionary, a KeyError
is raised. Here is an example:
students = { "N12345678": "Andrew Case", "N87654321": "Bruce Wayne" } # Remove myself and print the results student = students.pop("N12345678") print("Student =", student) # Print remaining students in the dictionary print("Students =", students)Output:
Student = Andrew Case Students = {'N87654321': 'Bruce Wayne'}
Often we may not care which item to pull out of a dictionary. We can do this using the DICTIONARY_NAME.popitem()
method which removes and returns an arbitrary (key, value) pair from the dictionary. This can be useful if you want to remove and process items at the same time. If the dictionary is empty, calling popitem() raises a KeyError. Here's an example:
students = { "N12345678": "Andrew Case", "N87654321": "Bruce Wayne" } # Remove and print one item student = students.popitem() print(student) # Remove and print another item student_id, student_name = students.popitem() print("Student ID:", student_id) print("Student:", student_name)Output:
('N87654321', 'Bruce Wayne') Student ID: N12345678 Student: Andrew Case
Programming Challenge: Below is unfinished code for a program that presents an interface for a technology related natural language dictionary. It will present a menu to the user and the ability to add, list, lookup, and delete terms from the dictionary. Compete the TODO sections so that these functions provide the proper functionality.
Note: The web-based coding environment does not provide real-time output. To work on this problem it is highly advised that you launch IDLE on your own computer and run the code locally.
Click the "Run" button to check your work, and click here to download the solution.
Now that you've completed this module, please visit our NYU Classes site and take the corresponding quiz for this module. These quizzes are worth 5% of your total grade and are a great way to test your Python skills! You may also use the following scratch space to test out any code you want.