Python Collections Module
The collections module provides specialized container datatypes such as Counter, defaultdict, and deque.
from collections import Counter, defaultdict, deque
Use these classes when regular list and dict objects work, but make the code awkward or slower.
Counter
Counter counts hashable objects.
from collections import Counter
letters = Counter('banana')
print(letters)
print(letters['a'])
Counter({'a': 3, 'n': 2, 'b': 1})
3
You can also ask for the most common values:
from collections import Counter
words = ['python', 'java', 'python', 'go', 'python', 'go']
counts = Counter(words)
print(counts.most_common(2))
[('python', 3), ('go', 2)]
defaultdict
defaultdict creates missing keys automatically.
from collections import defaultdict
scores = defaultdict(list)
scores['python'].append(10)
scores['python'].append(9)
print(scores['python'])
print(scores['javascript'])
[10, 9]
[]
This is useful when grouping data:
from collections import defaultdict
users = [('Ada', 'admin'), ('Grace', 'editor'), ('Linus', 'admin')]
by_role = defaultdict(list)
for name, role in users:
by_role[role].append(name)
print(dict(by_role))
{'admin': ['Ada', 'Linus'], 'editor': ['Grace']}
deque
deque is efficient for appending and popping from both ends.
from collections import deque
tasks = deque(['build', 'test'])
tasks.appendleft('lint')
tasks.append('deploy')
print(tasks.popleft())
print(tasks.pop())
print(tasks)
lint
deploy
deque(['build', 'test'])
deque can also keep only the newest values with maxlen:
from collections import deque
recent = deque(maxlen=3)
for page in ['home', 'docs', 'blog', 'contact']:
recent.append(page)
print(recent)
deque(['docs', 'blog', 'contact'], maxlen=3)