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)