collections Module
Overview
The built-in collections module provides specialized data structures that act as highly optimized alternatives to Python's general-purpose dicts, lists, and sets. When optimizing code for interviews or production environments, knowing when to deploy these structures separates average coders from experts. The most critical ones are Counter (for instantly counting hashable objects), defaultdict (for dictionaries that automatically initialize missing keys), and deque (a double-ended queue for fast O(1) appends and pops from both ends).
Syntax
from collections import Counter, defaultdict, deque
# 1. Counter: Automatically tallies frequencies
frequencies = Counter(["apple", "banana", "apple", "apple"])
print(frequencies["apple"]) # 3
print(frequencies.most_common(1)) # [('apple', 3)]
# 2. defaultdict: Never throws a KeyError
# Automatically creates a new empty list if the key is missing
graph = defaultdict(list)
graph["Node_A"].append("Node_B")
print(graph["Node_A"]) # ['Node_B']
# 3. deque: Double-Ended Queue
queue = deque([1, 2, 3])
queue.appendleft(0) # Fast O(1) insertion at the front!
first_item = queue.popleft() # Fast O(1) removal from the front!Common Pitfalls
- Using a standard Python list to implement a Queue.
list.pop(0)operates in O(N) time because it must shift every other element in memory. Always usedeque.popleft()which operates in O(1) time. - Using
defaultdictand accidentally triggering default creation. Just checkingif 'missing' in my_defaultdict:is safe, but accessingmy_defaultdict['missing']will permanently add the key to the dictionary with the default value.
Interview Questions
By using the Counter class: return Counter(string1) == Counter(string2). It tallies the character frequencies for both strings and compares the resulting dictionaries.
Real-World Example
Grouping a flat list of objects by a specific property without complex if/else logic.
from collections import defaultdict
employees = [
("Sales", "Alice"), ("Engineering", "Bob"),
("Sales", "Charlie"), ("Engineering", "Dave")
]
department_roster = defaultdict(list)
for dept, name in employees:
# No need to check if the dept key exists yet!
department_roster[dept].append(name)
print(department_roster["Sales"]) # ['Alice', 'Charlie']Check Your Knowledge
Test your understanding of collections Module with these quick questions.