Dictionary Fundamentals

When you need to store data that maps one piece of information to another, like a user ID to their profile, or a product code to its description, Python's dictionaries are the ideal choice. They provide an efficient way to retrieve values based on unique keys, making them a cornerstone of data management in many applications. Understanding their core mechanics — from creation to manipulation — is essential for writing robust and performant Python code.

What are Dictionaries?

A dictionary is an unordered, mutable collection of key-value pairs. Each key must be unique and immutable, while its corresponding value can be any data type and can be duplicated across different keys. Think of a dictionary like a physical dictionary where words (keys) map to their definitions (values), or a phonebook where names (keys) map to phone numbers (values). This structure allows for very fast lookups, additions, and deletions.

Dictionary (Python)
An unordered, mutable collection of unique, immutable keys, each mapped to a value. It allows for efficient retrieval of values by their associated keys.
Example: {'name': 'Alice', 'age': 30, 'city': 'New York'}

Creating Dictionaries

Python offers several straightforward ways to create dictionaries, catering to different scenarios. The most common method involves using curly braces {} to define key-value pairs directly. Alternatively, the dict() constructor can be used, either by passing keyword arguments or by providing an iterable of key-value tuples. Choosing the right method depends on whether you have the data readily available as literals, variables, or a sequence of pairs.

pythonVarious Dictionary Creation Methods

Accessing Values

To retrieve a value from a dictionary, you can use either square bracket notation (dictionary[key]) or the get() method. Square bracket access is direct but will raise a KeyError if the key does not exist. The get() method offers a safer alternative, returning None by default if the key is not found, or a specified default value if provided. This distinction is crucial for preventing runtime errors in your applications.

pythonAccessing Dictionary Values with `[]` and `get()`
⚠️ KeyError vs. `get()`

Using dictionary[key] is faster if you are certain the key exists. If there's a possibility the key might be missing, dictionary.get(key, default_value) is safer, as it prevents your program from crashing with a KeyError.

Check Your Understanding
What is the primary difference when accessing a non-existent key using [] versus get()?

Adding and Updating Key-Value Pairs

Dictionaries are mutable, meaning you can change their contents after creation. To add a new key-value pair, simply assign a value to a new key using square bracket notation. If the key already exists, this same assignment operation will update its associated value. This flexibility makes dictionaries highly dynamic and suitable for managing evolving datasets or configurations.

pythonAdding New and Updating Existing Dictionary Entries

Deleting Key-Value Pairs

Removing entries from a dictionary can be done in several ways. The del statement removes a specific key-value pair, raising a KeyError if the key doesn't exist. The pop() method also removes a key-value pair but returns the value associated with the removed key, and can take a default value to avoid KeyError. Finally, clear() removes all items from the dictionary, leaving it empty. Each method serves a slightly different purpose depending on whether you need the removed value or simply want to remove the entry.

pythonDeleting Dictionary Entries with `del`, `pop()`, and `clear()`
Try It Yourself
Given the inventory dictionary, add a new item 'Tablet' with quantity 150, update 'Laptop' quantity to 80, and then remove 'Monitor'. Finally, print the updated inventory.
python

Dictionary Keys: Immutability

A critical rule for dictionaries is that keys must be immutable. This means types like strings, numbers (integers, floats), and tuples can be used as keys, but mutable types like lists, sets, or other dictionaries cannot. The reason for this restriction lies in how dictionaries work internally: they use a hash function to quickly locate values. If a key were mutable, its hash value could change, making it impossible to reliably find the associated value after the key has been modified. This ensures the dictionary's efficiency and integrity.

pythonValid and Invalid Dictionary Keys
💡 Hashable Objects

An object is hashable if it has a hash value that never changes during its lifetime (meaning it's immutable) and can be compared to other objects. All of Python's built-in immutable types (numbers, strings, tuples) are hashable. Custom objects can be made hashable by implementing __hash__() and __eq__() methods.

Dictionary Values: Mutability

While dictionary keys must be immutable, there are no such restrictions on dictionary values. Values can be of any data type, including mutable types like lists, sets, or even other dictionaries. This flexibility allows you to build complex, nested data structures within a single dictionary, representing hierarchical or interconnected information. You can modify these mutable values directly without affecting the dictionary's internal key-hashing mechanism.

pythonUsing Mutable Types as Dictionary Values
Check Your Understanding
Which of the following Python data types CANNOT be used as a dictionary key?

Iterating Through Dictionaries

You often need to process all the items within a dictionary. Python provides three primary methods for iteration: keys(), values(), and items(). Iterating directly over a dictionary yields its keys by default. The keys() method explicitly returns a view of all keys, values() returns a view of all values, and items() returns a view of all key-value pairs as tuples. These views are dynamic, reflecting any changes made to the dictionary after their creation, making them efficient for large datasets.

pythonIterating Over Keys, Values, and Items

Checking for Key Existence

Before attempting to access or delete a key-value pair, it's often prudent to check if the key already exists in the dictionary. Python provides the in and not in operators for this purpose, offering a very efficient way to perform membership testing. This check is crucial for preventing KeyError exceptions and ensuring your code handles missing keys gracefully, especially when dealing with user input or external data sources.

pythonChecking for Key Existence with `in` and `not in`

Dictionary Comprehensions

Similar to list comprehensions, dictionary comprehensions provide a concise and readable way to create dictionaries. They allow you to build a new dictionary by iterating over an existing iterable and applying an expression to generate key-value pairs. This syntax is particularly powerful for transforming data, filtering items, or generating dictionaries based on specific patterns, often replacing more verbose for loops. It enhances code clarity and can be more performant for certain operations.

pythonCreating Dictionaries with Comprehensions
Comparing Dictionary Operations
OperationMethod 1: Square Brackets ([])Method 2: get() / pop()
Accessing Valuemy_dict[key]my_dict.get(key, default_value)
Behavior for Missing KeyRaises KeyErrorReturns None (or default_value)
Adding/Updating Valuemy_dict[key] = valuemy_dict.update({key: value}) or my_dict.setdefault(key, default_value)
Deleting Valuedel my_dict[key]my_dict.pop(key, default_value)
Returns Value on DeletionNoYes (the removed value)
Choosing the right method for dictionary operations depends on error handling and return value needs.
Key Takeaways
  • Dictionaries store unordered, mutable key-value pairs, providing efficient data retrieval by key.

  • Keys must be immutable (hashable) types like strings, numbers, or tuples; mutable types like lists are forbidden.

  • Values can be any data type, including mutable objects or other dictionaries, allowing for complex nested structures.

  • Access values using dictionary[key] (raises KeyError if missing) or dictionary.get(key, default) (returns None or default if missing).

  • Add or update pairs with dictionary[key] = value. Delete with del dictionary[key] or dictionary.pop(key, default).

  • Iterate through keys, values, or items using dictionary.keys(), dictionary.values(), and dictionary.items() respectively.

  • Use dictionary comprehensions for concise and efficient creation or transformation of dictionaries from existing iterables.

← All lessons in Data Structures: Dictionaries & Sets

Ready to keep this from fading?

Bitelrn turns lessons like this into a full course — quizzes, a knowledge map, and spaced review.

Get started free