Python > Core Python Basics > Data Structures > Dictionaries
Dictionary Comprehension
This snippet demonstrates the use of dictionary comprehension, a concise way to create dictionaries in Python. It's similar to list comprehension but generates a dictionary instead of a list.
Basic Dictionary Comprehension
This code uses dictionary comprehension to create a dictionary where the keys are the numbers from the `numbers` list, and the values are their squares. The syntax `{x: x**2 for x in numbers}` iterates through the `numbers` list. For each element `x`, it creates a key-value pair where the key is `x` and the value is `x**2` (x squared). The resulting dictionary is then printed.
numbers = [1, 2, 3, 4, 5]
squared_dict = {x: x**2 for x in numbers}
print(squared_dict)
Conditional Dictionary Comprehension
This demonstrates dictionary comprehension with a conditional statement. Only even numbers from the `numbers` list are used to create the dictionary. The `if x % 2 == 0` condition filters the numbers, so only even numbers are squared and added to the `even_squared_dict` dictionary.
numbers = [1, 2, 3, 4, 5]
even_squared_dict = {x: x**2 for x in numbers if x % 2 == 0}
print(even_squared_dict)
Zipping Two Lists into a Dictionary
This code uses the `zip()` function to combine two lists, `names` and `ages`, into a sequence of tuples. The dictionary comprehension then iterates through these tuples, creating a dictionary where the names are the keys and the ages are the values. `zip()` stops when the shortest input iterable is exhausted.
names = ['Alice', 'Bob', 'Charlie']
ages = [30, 25, 35]
name_age_dict = {name: age for name, age in zip(names, ages)}
print(name_age_dict)
concepts behind the snippet
Dictionary comprehension offers a compact and readable way to create dictionaries based on existing data structures. It combines the looping and conditional logic within the dictionary definition, making the code more concise.
Real-Life Use Case Section
Imagine you have a list of product IDs and a separate list of their corresponding prices. You can use dictionary comprehension with `zip()` to create a dictionary that maps each product ID to its price. This is much cleaner than using a traditional loop.
product_ids = ['P1', 'P2', 'P3']
prices = [10.00, 20.00, 15.00]
product_price_dict = {pid: price for pid, price in zip(product_ids, prices)}
print(product_price_dict)
When to use them
Use dictionary comprehension when you want to create a new dictionary from an existing iterable (e.g., list, tuple, or another dictionary) in a concise and readable way. Avoid using it for complex logic that would make the comprehension difficult to understand.
Memory footprint
Dictionary comprehension is generally as memory-efficient as using a traditional loop. The entire dictionary is created in memory at once. If you're dealing with extremely large datasets, consider using generators or iterators to avoid loading the entire data into memory at once. However, for most common use cases, dictionary comprehension is perfectly acceptable.
alternatives
The primary alternative is using a traditional `for` loop to create the dictionary. The choice depends on readability. If the logic is simple, comprehension can be cleaner. If the logic is complex, a loop may be easier to understand.
numbers = [1, 2, 3, 4, 5]
squared_dict = {}
for x in numbers:
squared_dict[x] = x**2
print(squared_dict)
pros
cons
FAQ
-
Is dictionary comprehension faster than using a loop?
In many cases, dictionary comprehension can be slightly faster than using a traditional loop because it is often optimized internally by Python. However, the performance difference is usually not significant unless you're dealing with very large datasets. -
Can I nest dictionary comprehensions?
While you can technically nest dictionary comprehensions, it's generally not recommended as it can significantly reduce readability. If you need to perform complex operations, it's usually better to use explicit loops or helper functions. -
What happens if `zip` receives lists of different lengths?
If you use `zip()` with lists of different lengths, it will stop iterating when the shortest list is exhausted. Any remaining elements in the longer lists will be ignored. If you need to handle this situation differently, you can use `itertools.zip_longest()` from the `itertools` module.