The map(function, iterable, *others) function applies a given function to every item of an iterable and yields the results as a memory-efficient iterator.
Lazy Functional Transformation: In Python 3, map() does not preallocate an entire list; it generates transformed values on-demand one by one. It accepts both built-in functions and custom lambda expressions. When multiple iterables are supplied, map() consumes items in parallel and halts as soon as the shortest iterable is exhausted. To select elements conditionally instead of transforming them, use filter().
The map() function accepts a callable transformation function and one or more iterables:
iterator = map(function, iterable, *others)
| Parameter | Type Accepted | Behavioral Details |
|---|---|---|
function |
Callable (function, lambda, built-in) | The transformation function applied to items. Must accept as many arguments as there are iterables passed. |
iterable |
Any iterable (list, tuple, str, set, generator) | The primary collection whose elements are sequentially passed to function. |
*others |
Zero or more iterables | Additional collections passed in parallel when function requires multiple positional arguments. |
| Return Value | map object (iterator) |
A lazy generator-like iterator yielding transformed elements on-demand. |
You can pass existing built-in functions or custom user-defined routines:
# 1. Using built-in function len to calculate string lengths
names = ["Alex", "Ronald", "John"]
lengths = map(len, names)
print("Lengths list:", list(lengths))
# 2. Using custom user-defined function
scores = [20, 30, 40]
def add_bonus(n: int) -> int:
return n + 5
updated_scores = map(add_bonus, scores)
print("Updated scores:", list(updated_scores))
Output:
Lengths list: [4, 6, 4]
Updated scores: [25, 35, 45]
When the transformation logic is short, an inline lambda avoids the boilerplate of defining named functions:
values = [1, 2, 3, 4, 5]
# Compute squares using an inline lambda
squares = map(lambda n: n ** 2, values)
print("Squares:", list(squares))
Output:
Squares: [1, 4, 9, 16, 25]
When multiple collections are passed, map() pulls items from each iterable in parallel. The iteration terminates when the shortest sequence is exhausted:
math_scores = [20, 30, 40]
english_scores = [30, 40, 50]
science_scores = [40, 50, 60]
# Function takes 3 arguments corresponding to the 3 iterables
def total_grade(m, e, s):
return m + e + s
totals = map(total_grade, math_scores, english_scores, science_scores)
print("Combined totals:", list(totals))
Output:
Combined totals: [90, 120, 150]
A frequent real-world idiom is preparing mixed-type collections for joining by mapping with str:
mixed_items = ["You", "have", "to", "pass", "in", 3, "languages"]
# Direct ' #'.join(mixed_items) raises TypeError due to integer 3
formatted_sentence = " #".join(map(str, mixed_items))
print("Formatted sentence:", formatted_sentence)
Output:
Formatted sentence: You #have #to #pass #in #3 #languages
map() vs. List Comprehensions 🔝Both constructs transform sequences, but differ in performance and style:
| Feature | map(func, iterable) |
List Comprehension [func(x) for x in it] |
|---|---|---|
| Evaluation Timing | Lazy iterator (computes items on-demand) | Eager (allocates entire list immediately) |
| Memory Footprint | O(1) constant auxiliary space | O(N) memory for the output list |
| Existing Built-in Functions | Faster in CPython: map(int, strings) |
Slightly more overhead wrapping function call |
| Complex Expressions & Filtering | Requires lambdas or filter() chaining |
Cleaner: supports inline if conditions |
Convert raw string rows into typed tuples without eager list preallocation:
raw_rows = [
["101", "Alice", "92.5"],
["102", "Bob", "88.0"]
]
def parse_row(row):
return (int(row[0]), row[1], float(row[2]))
parsed_stream = map(parse_row, raw_rows)
print("Parsed records:", list(parsed_stream))
Output:
Parsed records: [(101, 'Alice', 92.5), (102, 'Bob', 88.0)]
Compute weighted scores across assignments and exams using multiple sequences:
homework = [85, 90, 78]
midterm = [80, 92, 85]
final_exam = [90, 88, 82]
def compute_grade(hw, mid, fin):
return round(hw * 0.2 + mid * 0.3 + fin * 0.5, 1)
final_grades = map(compute_grade, homework, midterm, final_exam)
print("Weighted grades:", list(final_grades))
Output:
Weighted grades: [86.0, 89.6, 82.1]
map object is an iterator. Once it has been iterated over (e.g. via list(m) or a for loop), it is exhausted! Subsequent attempts to read from it will yield an empty collection.
m = map(lambda x: x * 2, [1, 2, 3])
print("First read:", list(m))
print("Second read (exhausted):", list(m))
Output:
First read: [2, 4, 6]
Second read (exhausted): []
Practice stream processing, multiple iterables, and data parsing in our companion Jupyter Notebook:
Explore interactive code cells, parse mixed data streams, benchmark map vs comprehensions, and run self-validating assertions.
View on GitHub Run in Google ColabRun these unit checks directly in Python or your local environment to verify map() mechanics:
def test_map_mechanics():
# 1. Single iterable transformation
assert list(map(len, ["a", "bb", "ccc"])) == [1, 2, 3]
# 2. Multi-iterable parallel evaluation
assert list(map(lambda x, y: x + y, [1, 2], [10, 20])) == [11, 22]
# 3. Shortest sequence termination
assert list(map(lambda x, y: x + y, [1, 2, 3], [10, 20])) == [11, 22]
# 4. Type conversion
assert list(map(int, ["10", "20", "30"])) == [10, 20, 30]
print("All map() unit assertions passed! 100% verified.")
test_map_mechanics()
Output:
All map() unit assertions passed! 100% verified.
Constructs an iterator from elements of an iterable for which a function returns True.
Returns a reverse iterator over sequence elements without creating a reversed copy.
Retrieves an iterator from an iterable object and advances through its elements.
Provides a concise, eager syntax to create and filter lists in a single readable line.
Author & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.