12.6. Search a Dictionary

With both lists and strings, we used the in and not in operators to search for specific values. These expressions returned either True or False depending on if the value was found in the collection.

Example

1
2
3
4
5
6
7
8
9
greeting = 'Hello, World!'
fruits = ['apple', 'banana', 'pear', 'kiwi', 'orange']
numbers = [28, 32, 7, 29, 33, 0]

print('or' in greeting)  # Search for the substring 'or' in the larger string.
print('nana' in fruits)  # Search for the value 'nana' in the list of strings.

print('!' not in greeting) # Check if '!' is NOT in 'Hello, World!'.
print(42 not in numbers)   # Check if 42 is NOT in the numbers list.

Console Output

True
False
False
True

Since the elements in a dictionary come as pairs, we search for an item in either the set of keys or the set of values.

We practiced with the keys() and values() methods in the previous two sections, and we can use them in a similar way to search a dictionary.

Example

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
ticket_holders = {
   'Bob' : 100,
   'Jessi' : 103,
   'Maria' : 101,
   'Devon' : 102
}

print(101 in ticket_holders.keys())
print(101 in ticket_holders.values())

print('Jessi' in ticket_holders.keys())
print('Jessi' in ticket_holders.values())

Console Output

False
True
True
False
  1. In line 8, 101 in ticket_holders.keys() returns False. Even though 101 is in the dictionary, it is a value, and in this case we are searching through the keys.
  2. In line 9, 101 in ticket_holders.values() returns True.
  3. In lines 11 and 12, we search for the string 'Jessi' first in the keys and then in the values.

12.6.1. Default Search Method

If we do not add the keys() or values() method after the dictionary name, Python searches the keys by default.

This means that

search_value in dictionary_name.keys()

returns the same result as

search_value in dictionary_name

12.6.2. Try It!

Let’s build a quick search algorithm for a phone_book dictionary. In the code editor below, begin with the following:

  1. Note how the input statement on line 12 modifies the name entered by the user. Attaching the lower() and capitalize() methods makes sure that the string matches the format of the keys in phone_book. The entries 'john', 'John', and 'JOHN' all get converted to 'John'.
  2. On lines 15-18, add an if/else block that does the following:
    1. Checks if name is one of the keys in phone_book.
    2. If True, print "The number for ___ is ___." Fill in the first blank with the entered name (the key). Fill in the second blank with that person’s phone number (the value).
    3. If False, print "Sorry, ___ is not in your phone book." Fill in the blank with the entered name.
  3. Run the program several times to make sure it responds correctly.

Now expand the program:

  1. On line 20, paste a new input statement:

    ph_number = input("Enter a phone number: ")
    
  2. Add a second if/else block that:

    1. Checks if ph_number is NOT a value in the phone_book.

    2. If True, prints "___ is not in your phone book!". Fill in the blank with the entered phone number.

    3. If False, runs the following loop. Be sure to indent it properly compared to the else keyword.

      26
      27
      28
      for (key, value) in phone_book.items():
         if value == ph_number:
            print(f"Dialing {ph_number} will call {key}.")
      

12.6.2.1. Sample Output

Properly done, your output should look something like this:

Enter a name:  kimberly
The number for Kimberly is 555-5509.
Enter a phone number:  333-3333
333-3333 is not in your phone book!
Enter a name:  will
Sorry, Will is not in your phone book.
Enter a phone number:  555-5162
Dialing 555-5162 will call Becky.

12.6.2.2. Bonus!

Update the program to add a new key/value pair to the dictionary if the name entered by the user is NOT already in phone_book.