The max() built-in function returns the largest item from an iterable or the largest of two or more positional arguments.
Extremum Selection & Key Evaluation: max() scans elements in linear O(N) time without sorting the underlying container. It accepts an optional key callable (such as len or str.lower) to compute proxy comparison values, and a default parameter to prevent ValueError on empty collections. To find the lowest item, see companion function min(), or sort collections with sorted().
The max() function supports two operational forms:
# Formal syntax of built-in max()
# Form 1: Single iterable with optional default and key
max_item = max(iterable, *, key=None, default=sentinel)
# Form 2: Two or more positional arguments with optional key
max_item = max(arg1, arg2, *args, key=None)
| Parameter | Type Accepted | Behavioral Details |
|---|---|---|
iterable or arg1, arg2, *args |
Iterable[T] or multiple objects |
A single collection (list, tuple, string, set) OR 2+ distinct arguments. |
key |
Callable (1 arg) or None |
Optional proxy function extracting a comparison key from each element. Defaults to None. |
default |
Any object | Returned when iterable is empty. Valid only with single iterable form. |
| Return Value | Element of iterable |
Returns the item yielding the largest comparison value. If multiple items are equal, returns the first encountered. |
You can pass individual numbers as positional arguments or pass an entire collection:
# 1. Finding maximum from positional arguments
print("max(4, 7): ", max(4, 7))
print("max(14, 3, 88, 22, -5):", max(14, 3, 88, 22, -5))
# 2. Finding maximum from an iterable list or tuple
numbers = [1, 2, 3, 4, 5]
print("max([1, 2, 3, 4, 5]): ", max(numbers))
coords = (12.5, 94.2, 8.9)
print("max((12.5, 94.2, 8.9)): ", max(coords))
Output:
max(4, 7): 7
max(14, 3, 88, 22, -5): 88
max([1, 2, 3, 4, 5]): 5
max((12.5, 94.2, 8.9)): 94.2
Strings are compared by Unicode code points. Lowercase letters have higher code point values than uppercase letters. Use key=str.lower for case-insensitive checks:
# Lexicographical comparison based on Unicode code points
title_words = ['Hello', 'Welcome', 'To', 'Plus2net']
print("Title case max: ", max(title_words)) # 'Welcome'
mixed_words = ['Hello', 'Welcome', 'to', 'plus2net']
print("Mixed case max: ", max(mixed_words)) # 'to' (ASCII 't' = 116 > 'W' = 87)
# Case-insensitive comparison using key=str.lower
print("Case-insensitive:", max(mixed_words, key=str.lower)) # 'Welcome'
Output:
Title case max: Welcome
Mixed case max: to
Case-insensitive: Welcome
Passing a dictionary directly evaluates its keys. To find the key associated with the maximum value, use key=dict.get:
# Dictionaries evaluate KEYS by default, not values
scores = {'Raju': 45, 'Ronn': 56, 'Tom': 50}
print("Max key alphabetically:", max(scores)) # 'Tom'
# To find the key with the maximum value, pass key=scores.get
top_student = max(scores, key=scores.get)
print("Top scoring student: ", top_student, "with score", scores[top_student])
# To find the maximum (key, value) tuple:
max_pair = max(scores.items(), key=lambda item: item[1])
print("Highest score pair: ", max_pair)
Output:
Max key alphabetically: Tom
Top scoring student: Ronn with score 56
Highest score pair: ('Ronn', 56)
Comparing multiple sequences evaluates elements position-by-position until an inequality is found:
# Positional comparison across multiple sequences
# Comparison proceeds from left to right element-by-element
list1 = [4, 7, 8, 9]
list2 = [5, 1, 1]
list3 = [6, 1, -3]
# Index 0 comparison: 6 > 5 > 4, so list3 is greatest
print("Positional list max:", max(list1, list2, list3))
# Comparing by aggregated property using key=sum or key=len
print("Max by sum: ", max(list1, list2, [5, 1, 100], key=sum))
print("Max by length: ", max(['alpha', 'beta', 'elephant'], key=len))
Output:
Positional list max: [6, 1, -3]
Max by sum: [5, 1, 100]
Max by length: elephant
Calling max() on an empty collection raises ValueError. The default argument provides a safe fallback:
# Suppressing ValueError on empty iterables using default
empty_log = []
# Without default, max([]) raises ValueError: max() arg is an empty sequence
try:
max(empty_log)
except ValueError as err:
print("ValueError caught:", err)
# Safe pattern: providing a default fallback value
safe_max = max(empty_log, default=0)
print("Safe max with default: ", safe_max)
safe_record = max(empty_log, default={"score": 0})
print("Safe record fallback score:", safe_record["score"])
Output:
ValueError caught: max() arg is an empty sequence
Safe max with default: 0
Safe record fallback score: 0
Below are real-world recipes utilizing max() for record rankings and string length scanning:
# Recipe A: Finding the highest earner in a company
employees = [
{"name": "Alice", "dept": "HR", "salary": 75000},
{"name": "Bob", "dept": "IT", "salary": 92000},
{"name": "Charlie", "dept": "IT", "salary": 85000},
]
top_earner = max(employees, key=lambda e: e["salary"])
print(f"Top Earner: {top_earner['name']} with salary {top_earner['salary']}")
# Recipe B: Finding longest line in a text document
document = [
"Short header",
"A much longer descriptive paragraph of text",
"Footer notice"
]
longest_line = max(document, key=len)
print("Longest line length:", len(longest_line))
print("Longest text: ", longest_line)
Output:
Top Earner: Bob with salary 92000
Longest line length: 43
Longest text: A much longer descriptive paragraph of text
TypeError: '>' not supported between instances. Provide a homogeneous key function like key=str if needed.default when passing multiple positional arguments (e.g. max(1, 2, default=0)) raises a TypeError. The default parameter is only valid when evaluating a single iterable.max() consistently returns the first one encountered in the iterable.# Pitfall 1: Unorderable mixed types in Python 3
try:
max([10, "apple", 5])
except TypeError as err:
print("TypeError caught:", err)
# Pitfall 2: Confusing multiple arguments with a single iterable
print("Three args: ", max(1, 2, 3))
print("Single list arg:", max([1, 2, 3]))
Output:
TypeError caught: '>' not supported between instances of 'str' and 'int'
Three args: 3
Single list arg: 3
Practice extremum search, dictionary key evaluations, and record rankings in our companion Jupyter Notebook:
Explore interactive code cells, benchmark key function performance, rank complex record lists, and run self-validating assertions.
View on GitHub Run in Google ColabRun these unit checks directly in Python or your local environment to verify max() mechanics:
def test_max_mechanics():
# 1. Positional and iterable
assert max(10, 20, 5) == 20
assert max([10, 20, 5]) == 20
# 2. Key function
words = ["apple", "pie", "banana"]
assert max(words, key=len) == "banana"
# 3. Default fallback on empty collection
assert max([], default=-1) == -1
# 4. Dictionary value search
data = {"a": 30, "b": 10, "c": 20}
assert max(data, key=data.get) == "a"
print("All max() unit assertions passed! 100% verified.")
test_max_mechanics()
Output:
All max() unit assertions passed! 100% verified.
Returns the smallest item from an iterable or series of arguments.
Sorts all elements of an iterable using stable Timsort ordering.
Sums numeric elements in an iterable with an optional starting value.
Calculates the non-negative magnitude of a number or complex vector.
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.