💡 Python QuickBits — 🧮 Operator Shortcuts (itemgetter > lambda)


Description:

When sorting collections like lists of dicts, many of us reach for lambda. It works—but Python’s operator.itemgetter is cleaner, less error-prone, and usually faster, especially in large datasets or tight loops.


📝 Sorting by One Key (Lambda → itemgetter)

from operator import itemgetter

players = [
    {"name": "Ava",   "score": 92},
    {"name": "Liam",  "score": 77},
    {"name": "Mila",  "score": 92},
    {"name": "Noah",  "score": 85},
]

# Lambda way (works)
by_score_lambda = sorted(players, key=lambda d: d["score"], reverse=True)

# itemgetter way (cleaner & faster)
by_score_getter = sorted(players, key=itemgetter("score"), reverse=True)

Both give the same result; itemgetter("score") reads like “get the score field”.


🧩 Sorting by Multiple Keys (Tie-Breakers)

# Sort by score (desc), then by name (asc) as tie-breaker
by_score_name = sorted(players, key=itemgetter("score", "name"), reverse=True)

With lambdas, you’d write lambda d: (d["score"], d["name"]). itemgetter("score","name") is shorter and avoids typos.


⚡ Why Prefer itemgetter ?

  • Cleaner intent: itemgetter("score") says exactly what it does.
  • Fewer typos: No repeated ["key"] strings across lambdas.
  • Micro-perf: CPython-level implementation can be slightly faster.

✅ Key Points

  • Use operator.itemgetter for sorting by dict keys (single or multiple).
  • Prefer it over custom lambdas for clarity and maintainability.
  • Keep lambdas for custom logic that itemgetter can’t express.

Code Snippet:

from operator import itemgetter   # provides a callable to fetch item(s) by key/index


players = [
    {"name": "Ava",   "score": 92},
    {"name": "Liam",  "score": 77},
    {"name": "Mila",  "score": 92},
    {"name": "Noah",  "score": 85},
]

# Using lambda to sort by score (descending)
by_score_lambda = sorted(players, key=lambda d: d["score"], reverse=True)

# Using itemgetter to sort by score (descending) — shorter, cleaner
by_score_getter = sorted(players, key=itemgetter("score"), reverse=True)

print("By score (lambda):", by_score_lambda)
print("By score (itemgetter):", by_score_getter)


# Sort by score (desc), then name (asc)
by_score_name = sorted(players, key=itemgetter("score", "name"), reverse=True)

print("By score desc, then name asc:", by_score_name)


# Get the top 2 players by score
top2 = sorted(players, key=itemgetter("score"), reverse=True)[:2]

print("Top 2 by score:", top2)

Link copied!

Comments

Add Your Comment

Comment Added!