AW Dev Rethought

โœ‚๏ธ Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away - Antoine de Saint-Exupรฉry

๐Ÿ’ก 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!