name: use-counter-frequency description: "For counting and frequency: histograms, most common elements, vote tallying, neighbor counting, word frequencies, distribution analysis."
use-counter-frequency
When to Use
- Counting occurrences of items
- Finding most common elements
- Building histograms
- Vote/tally counting
- Word frequency analysis
- Neighbor counting in grids
- Any "how many of each" question
When NOT to Use
- When you need the items themselves, not counts
- Single occurrence checking (use set)
- When counts need to be updated in complex ways
The Pattern
Use collections.Counter - a dict subclass optimized for counting.
from collections import Counter
# Count anything iterable
Counter('abracadabra') # {'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}
Counter([1, 1, 2, 3, 3, 3]) # {3: 3, 1: 2, 2: 1}
# Most common
counter.most_common(3) # Top 3 as [(item, count), ...]
# Arithmetic
Counter('abc') + Counter('bcd') # {'b': 2, 'c': 2, 'a': 1, 'd': 1}
# Total count
sum(counter.values())
Example (from pytudes)
from collections import Counter
# Word frequency from text (spell.py)
def words(text):
return re.findall(r'\w+', text.lower())
WORDS = Counter(words(open('big.txt').read()))
# WORDS['the'] = 79809
def P(word, N=sum(WORDS.values())):
"""Probability of word."""
return WORDS[word] / N
# Neighbor counting (Life.ipynb)
def neighbor_counts(world):
"""For each cell, count how many live neighbors it has."""
return Counter(neighbor
for cell in world
for neighbor in neighbors(cell))
# Use for Game of Life rules
counts = neighbor_counts(world)
new_world = {cell for cell, count in counts.items()
if count == 3 or (count == 2 and cell in world)}
# Probability distribution (Probability.ipynb)
class Dist(Counter):
"""A distribution of {outcome: frequency}."""
pass
DK = Dist(GG=121801, GB=126840, BG=127123, BB=135138)
# Access: DK['GG'], DK.most_common(), sum(DK.values())
Key Principles
- Counter is a dict: All dict methods work
- Missing keys = 0: No KeyError for missing items
- most_common(n): Get top n items efficiently
- Arithmetic works: Add, subtract, intersect counters
- Generator input:
Counter(x for x in iterable if condition)