How to use 'min' and 'max' in Python

Learn to use Python's min() and max() functions. Discover different methods, tips, real-world applications, and how to debug common errors.

How to use 'min' and 'max' in Python
Published on: 
Tue
Mar 3, 2026
Updated on: 
Fri
Mar 6, 2026
The Replit Team Logo Image
The Replit Team

Python's built-in min() and max() functions are essential tools. They find the smallest and largest values in any data collection, from simple lists to complex iterables.

In this guide, you'll explore various techniques and real-world applications for both functions. You'll also receive practical tips and debugging advice to confidently handle any scenario in your projects.

Basic usage of min() and max()

numbers = [42, 17, 8, 94, 31, 5]
minimum = min(numbers)
maximum = max(numbers)
print(f"Minimum: {minimum}, Maximum: {maximum}")--OUTPUT--Minimum: 5, Maximum: 94

The code demonstrates how min() and max() operate directly on an iterable. By passing the numbers list to each function, you get the lowest and highest values without needing to write a manual loop.

This approach is efficient because the functions are highly optimized C implementations in the standard library. They handle the entire process of iterating and comparing internally, making your code both cleaner and faster than a custom Python loop would be.

Working with different data types

Beyond lists, min() and max() demonstrate their versatility with other data types, including tuples, sets, strings, and dictionaries, each presenting unique considerations.

Using min() and max() with tuples and sets

my_tuple = (15, 3, 27, 8)
my_set = {42, 17, 8, 94}
print(f"Tuple min: {min(my_tuple)}, max: {max(my_tuple)}")
print(f"Set min: {min(my_set)}, max: {max(my_set)}")--OUTPUT--Tuple min: 3, max: 27
Set min: 8, max: 94

Just as with lists, you can use min() and max() on tuples and sets without changing your approach. The functions simply iterate through the collection and compare the elements to find the extremes.

  • With the tuple my_tuple, the functions find the smallest and largest numbers based on their value.
  • For the set my_set, they also work as expected, even though sets themselves are unordered.

This consistent behavior means you don't have to worry about the specific iterable type you're working with.

Using min() and max() with strings

words = ["apple", "banana", "cherry", "date"]
print(f"Alphabetically first: {min(words)}")
print(f"Alphabetically last: {max(words)}")
print(f"Shortest word: {min(words, key=len)}")
print(f"Longest word: {max(words, key=len)}")--OUTPUT--Alphabetically first: apple
Alphabetically last: date
Shortest word: date
Longest word: banana

When used with strings, min() and max() perform an alphabetical comparison by default. For the list words, min() returns "apple" because it comes first alphabetically, while max() returns "date".

You can customize this behavior using the key argument. By passing key=len, you instruct the functions to evaluate the length of each string instead of its alphabetical value.

  • min(words, key=len) finds the shortest word, which is "date".
  • max(words, key=len) finds the longest word, "banana".

Working with dictionaries using min() and max()

scores = {"Alice": 92, "Bob": 85, "Charlie": 97, "Dave": 78}
lowest_scorer = min(scores, key=scores.get)
highest_scorer = max(scores, key=scores.get)
print(f"Lowest score: {lowest_scorer} with {scores[lowest_scorer]}")
print(f"Highest score: {highest_scorer} with {scores[highest_scorer]}")--OUTPUT--Lowest score: Dave with 78
Highest score: Charlie with 97

When working with dictionaries, min() and max() iterate over the keys by default. To compare items based on their values, you can use the key argument. Setting key=scores.get tells the functions to look up the value for each key and use that for the comparison instead.

  • min(scores, key=scores.get) finds the key with the lowest associated value, returning "Dave".
  • max(scores, key=scores.get) finds the key with the highest value, returning "Charlie".

Advanced techniques and use cases

Building on the versatility of the key argument, you can tackle more complex challenges like comparing custom objects, finding multiple extreme values, and handling empty iterables.

Using min() and max() with custom objects

class Product:
   def __init__(self, name, price):
       self.name = name
       self.price = price
   
   def __repr__(self):
       return f"{self.name}: ${self.price}"

products = [Product("Laptop", 1200), Product("Phone", 800), Product("Tablet", 500)]
cheapest = min(products, key=lambda p: p.price)
most_expensive = max(products, key=lambda p: p.price)
print(f"Cheapest: {cheapest}\nMost expensive: {most_expensive}")--OUTPUT--Cheapest: Tablet: $500
Most expensive: Laptop: $1200

When you use min() and max() on a list of custom objects, Python doesn't automatically know which attribute to compare. You must explicitly tell the functions how to evaluate the objects—in this case, whether to sort by name or price.

The key argument with a lambda function provides a clean solution. Here’s how it works:

  • The expression key=lambda p: p.price creates a small, anonymous function.
  • For each Product object in the list, this function returns its price.
  • min() and max() then use these prices to find the objects with the lowest and highest values.

Finding multiple minimums and maximums with heapq

import heapq
numbers = [42, 17, 8, 94, 31, 5, 11, 63]
three_smallest = heapq.nsmallest(3, numbers)
three_largest = heapq.nlargest(3, numbers)
print(f"Three smallest: {three_smallest}")
print(f"Three largest: {three_largest}")--OUTPUT--Three smallest: [5, 8, 11]
Three largest: [94, 63, 42]

While min() and max() are perfect for finding a single extreme value, they can't return several. For that, you can use Python's heapq module, which is built for this kind of task.

  • heapq.nsmallest(n, iterable) efficiently finds the n smallest items.
  • heapq.nlargest(n, iterable) does the same for the largest items.

These functions are more efficient than sorting the entire list, especially for large datasets. By passing 3 and the numbers list, you get the three smallest and largest values directly.

Using min() and max() with default arguments

empty_list = []
# This would raise ValueError: min() arg is an empty sequence
# min(empty_list)
# Using default value instead:
min_value = min(empty_list, default=0)
max_value = max(empty_list, default=0)
print(f"Min with default: {min_value}")
print(f"Max with default: {max_value}")--OUTPUT--Min with default: 0
Max with default: 0

Calling min() or max() on an empty collection normally triggers a ValueError because there are no items to compare. To prevent your program from crashing, you can use the default argument to provide a fallback value.

  • When you pass an argument like default=0, the function returns 0 if the iterable is empty instead of raising an error.
  • This lets you handle empty sequences gracefully without needing a separate if check, making your code cleaner and more concise.

Move faster with Replit

Replit is an AI-powered development platform that transforms natural language into working applications. Describe what you want to build, and Replit Agent creates it—complete with databases, APIs, and deployment.

For the min() and max() techniques covered in this guide, Replit Agent can turn them into production-ready tools:

  • Build a price comparison tool that finds the cheapest and most expensive options for a product.
  • Create a performance dashboard that identifies the top and bottom performers from a dataset based on a specific metric.
  • Deploy a leaderboard utility that displays the N-highest or N-lowest scores in a game or competition.

Describe your app idea, and Replit Agent will write the code, test it, and fix issues automatically, turning the concepts from this guide into a fully functional application right in your browser.

Common errors and challenges

Using min() and max() is simple, but you can run into tricky situations with mixed data types, strings, or special numeric values.

Handling TypeError when comparing mixed types

You'll encounter a TypeError if you ask min() or max() to compare items of different types, like numbers and strings. Python doesn't know how to rank them against each other, so it stops. See what happens in this example.

mixed_list = [42, "hello", 10, "world"]
minimum = min(mixed_list)  # This will raise TypeError
print(f"Minimum value: {minimum}")

The code fails because Python can't decide if an integer like 42 is greater or less than a string like "hello". This ambiguity is what causes the TypeError. See how to resolve this in the next example.

# Separate by type first
numbers = [x for x in mixed_list if isinstance(x, int)]
strings = [x for x in mixed_list if isinstance(x, str)]
print(f"Minimum number: {min(numbers)}")
print(f"Minimum string: {min(strings)}")

The best way to resolve a TypeError with mixed data is to separate the items by type before comparing them. The example code does this efficiently:

  • It uses two list comprehensions to filter the original list.
  • The isinstance() function checks if an item is an integer or a string.
  • This creates clean, type-specific lists, allowing min() and max() to work without errors.

This approach is especially useful when handling unpredictable data from external sources.

Case sensitivity when using min() and max() with strings

You might get unexpected results when using min() and max() with strings because the comparison is case-sensitive. Python ranks uppercase letters before lowercase ones, which can skew alphabetical sorting. The following code demonstrates how this plays out in practice.

words = ["Apple", "banana", "Cherry", "date"]
print(f"Alphabetically first: {min(words)}")
print(f"Alphabetically last: {max(words)}")

The code returns 'Apple' as the minimum because uppercase letters are valued lower than lowercase ones, making 'date' the maximum. The next example shows how to get a true alphabetical sort by ignoring case.

words = ["Apple", "banana", "Cherry", "date"]
print(f"Alphabetically first: {min(words, key=str.lower)}")
print(f"Alphabetically last: {max(words, key=str.lower)}")

To get a true alphabetical sort, you can ignore case by using the key argument. This is crucial when dealing with user input or text from files where capitalization can be inconsistent.

  • Setting key=str.lower tells min() and max() to convert each string to lowercase before comparing them.
  • This ensures "Apple" and "apple" are treated equally, giving you a correct alphabetical result regardless of their original casing.

Handling NaN values with min() and max()

When your data includes NaN (Not a Number) values, which represent undefined results, you'll find that min() and max() behave unexpectedly. That's because any comparison with NaN is always false, making it impossible to sort. See what happens in this example.

import numpy as np
data = [42, 17, 8, np.nan, 31]
minimum = min(data)  # NaN comparison will make this fail
maximum = max(data)
print(f"Minimum: {minimum}, Maximum: {maximum}")

The code returns an inconsistent result because of how each function handles np.nan. While min() ignores the np.nan value, max() returns it, which isn't the true maximum. The next example shows how to get a correct result.

import numpy as np
data = [42, 17, 8, np.nan, 31]
clean_data = [x for x in data if not np.isnan(x)]
minimum = min(clean_data)
maximum = max(clean_data)
print(f"Minimum: {minimum}, Maximum: {maximum}")

To get accurate results with min() and max(), you must first remove any NaN values. The best approach is to filter them out before making comparisons.

  • A list comprehension like [x for x in data if not np.isnan(x)] creates a new list containing only valid numbers.
  • This ensures min() and max() operate on clean data, giving you the correct extremes.

That's crucial when working with scientific data or calculations that can produce undefined results.

Real-world applications

Now that you can navigate common errors, you can use min() and max() to solve practical problems in finance and data analysis.

Using min() and max() for financial analysis

Calculating a stock's price range and volatility is straightforward with min() and max(), as you can instantly find the highest and lowest values in a dataset.

stock_prices = [156.78, 152.45, 163.22, 157.90, 159.75, 161.20]
price_range = max(stock_prices) - min(stock_prices)
percent_volatility = (price_range / min(stock_prices)) * 100
print(f"Price range: ${price_range:.2f}")
print(f"Volatility: {percent_volatility:.2f}%")

This example shows how to analyze a list of stock_prices. The code finds the highest and lowest values using max() and min(), which is more efficient than sorting the entire list.

  • The price_range is the difference between the peak and bottom prices, giving you the total value spread.
  • percent_volatility puts that spread into context. It calculates the range as a percentage of the lowest price, offering a simple measure of risk.

This approach quickly turns raw numbers into a useful financial snapshot.

Finding outliers in datasets with min() and max()

While min() and max() can find the absolute highest and lowest values, a more robust method for identifying statistical outliers uses the interquartile range to define acceptable boundaries.

import numpy as np

measurements = [102, 104, 98, 101, 99, 97, 143, 100, 103, 95]
q1, q3 = np.percentile(measurements, [25, 75])
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr

outliers = [x for x in measurements if x < lower_bound or x > upper_bound]
print(f"Identified outliers: {outliers}")

This code identifies statistical outliers using the interquartile range (IQR) method. It leverages NumPy's np.percentile() function to find the 25th (Q1) and 75th (Q3) percentiles of the data, which represent the middle 50% of your values.

  • The IQR is calculated as the difference between q3 and q1.
  • A lower and upper bound are then established by extending 1.5 times the IQR below Q1 and above Q3.

Finally, a list comprehension filters the measurements list, collecting any values that fall outside this statistically defined range.

Get started with Replit

Turn your knowledge of min() and max() into a real tool. Give Replit Agent a prompt like "build a stock price volatility calculator" or "create a script that finds outlier data points in a CSV."

The agent writes the code, tests for errors, and deploys your app. You just provide the idea. Start building with Replit.

Get started free

Create and deploy websites, automations, internal tools, data pipelines and more in any programming language without setup, downloads or extra tools. All in a single cloud workspace with AI built in.

Get started for free

Create & deploy websites, automations, internal tools, data pipelines and more in any programming language without setup, downloads or extra tools. All in a single cloud workspace with AI built in.