PYTHON
Group Data by Key Using Python's `collections.defaultdict`
Efficiently group items from a list of dictionaries into a new dictionary where keys are a common attribute and values are lists of grouped items, leveraging `defaultdict`.
from collections import defaultdict
data = [
{'id': 1, 'category': 'Electronics', 'name': 'Laptop'},
{'id': 2, 'category': 'Books', 'name': 'Python Handbook'},
{'id': 3, 'category': 'Electronics', 'name': 'Smartphone'},
{'id': 4, 'category': 'Books', 'name': 'Algorithms Explained'},
{'id': 5, 'category': 'Apparel', 'name': 'T-Shirt'}
]
# Using a regular dictionary (requires checking for key existence)
grouped_data_regular = {}
for item in data:
category = item['category']
if category not in grouped_data_regular:
grouped_data_regular[category] = []
grouped_data_regular[category].append(item)
print(f"Grouped with regular dict: {grouped_data_regular}")
# Using defaultdict (more concise)
grouped_data_defaultdict = defaultdict(list)
for item in data:
grouped_data_defaultdict[item['category']].append(item)
print(f"Grouped with defaultdict: {dict(grouped_data_defaultdict)}") # Convert to dict for display
# Example of grouping by multiple keys (e.g., category and then by availability)
more_data = [
{'id': 1, 'category': 'Electronics', 'name': 'Laptop', 'available': True},
{'id': 2, 'category': 'Books', 'name': 'Python Handbook', 'available': True},
{'id': 3, 'category': 'Electronics', 'name': 'Smartphone', 'available': False},
{'id': 4, 'category': 'Books', 'name': 'Algorithms Explained', 'available': True},
]
grouped_by_category_and_availability = defaultdict(lambda: defaultdict(list))
for item in more_data:
grouped_by_category_and_availability[item['category']][item['available']].append(item)
print(f"Grouped by category and availability: {grouped_by_category_and_availability}")
How it works: `collections.defaultdict` is a powerful subclass of `dict` that simplifies handling missing keys. When you try to access a key that doesn't exist, it automatically creates it using the factory function provided during initialization (e.g., `list` for an empty list). This eliminates the need for explicit `if key not in dict:` checks, making code for grouping or accumulating items much cleaner and more readable. It's ideal for scenarios like organizing database query results or API responses.