DocsHub
PythonBeginner

Find Largest Number

Learn how to find the largest number in a list in Python without using built-in max().

Find Largest Number

Problem

Given a list of numbers, find the largest one. Do not use Python's built-in max() function — the goal is to understand how it works internally.

Input:  [3, 1, 9, 7, 5]
Output: 9

Input:  [100, 200, 50, 300, 150]
Output: 300

Input:  [-5, -1, -8, -3]
Output: -1

Input:  [42]
Output: 42

Logic

  1. Assume the first number is the largest
  2. Go through every other number in the list
  3. If the current number is bigger than the assumed largest — update the largest
  4. After checking all numbers — the assumed largest is the real largest
  5. Return it

Flow

Yes No Yes No Start largest = first number in list Take next number number > largest? largest = number Keep largest as is More numbers? Return largest

Solution 1 — using a loop

Start with the first number as the largest. Loop through the rest and update whenever a bigger number is found.

def find_largest(numbers):
    # handle empty list
    if not numbers:
        return None

    # assume the first number is the largest
    largest = numbers[0]

    # check every other number starting from index 1
    for number in numbers[1:]:
        if number > largest:
            largest = number   # found a bigger one — update

    return largest


print(find_largest([3, 1, 9, 7, 5]))        # 9
print(find_largest([100, 200, 50, 300, 150])) # 300
print(find_largest([-5, -1, -8, -3]))        # -1
print(find_largest([42]))                    # 42
print(find_largest([]))                      # None

Code Execution — Solution 1

Trace through find_largest([3, 1, 9, 7, 5]):

Stepnumbernumber > largest?largest
Start3
1st11 > 3 → No3
2nd99 > 3 → Yes9
3rd77 > 9 → No9
4th55 > 9 → No9
Done9

Trace through find_largest([-5, -1, -8, -3]):

Stepnumbernumber > largest?largest
Start-5
1st-1-1 > -5 → Yes-1
2nd-8-8 > -1 → No-1
3rd-3-3 > -1 → No-1
Done-1

Starting largest at numbers[0] instead of 0 is important. If all numbers are negative like [-5, -1, -8], starting at 0 would wrongly return 0 since no number is greater than 0. Starting at the first element guarantees correctness for any list.


Solution 2 — using index tracking

Same logic but also track the index of the largest number — useful when you need to know where the largest is, not just what it is.

def find_largest(numbers):
    if not numbers:
        return None

    largest_index = 0   # assume first element is largest

    for i in range(1, len(numbers)):
        if numbers[i] > numbers[largest_index]:
            largest_index = i   # update the index of the largest

    return numbers[largest_index]


print(find_largest([3, 1, 9, 7, 5]))          # 9
print(find_largest([100, 200, 50, 300, 150]))  # 300
print(find_largest([-5, -1, -8, -3]))          # -1

Code Execution — Solution 2

Trace through find_largest([100, 200, 50, 300, 150]):

Stepinumbers[i]numbers[largest_index]Update index?largest_index
Start1000
1st1200100Yes1
2nd250200No1
3rd3300200Yes3
4th4150300No3
Done3

numbers[3] = 300 → return 300


Solution 3 — using recursion

Break the problem down — the largest of a list is the larger of the first element and the largest of the rest.

def find_largest(numbers):
    if not numbers:
        return None

    # base case — one element, it is the largest
    if len(numbers) == 1:
        return numbers[0]

    # recursive case
    # find the largest of the rest of the list
    largest_of_rest = find_largest(numbers[1:])

    # compare first element with largest of the rest
    if numbers[0] > largest_of_rest:
        return numbers[0]
    else:
        return largest_of_rest


print(find_largest([3, 1, 9, 7, 5]))          # 9
print(find_largest([100, 200, 50, 300, 150]))  # 300
print(find_largest([-5, -1, -8, -3]))          # -1
print(find_largest([42]))                      # 42

Code Execution — Solution 3

Trace through find_largest([3, 1, 9, 7, 5]):

find_largest([3, 1, 9, 7, 5])
  compare 3 with find_largest([1, 9, 7, 5])
    compare 1 with find_largest([9, 7, 5])
      compare 9 with find_largest([7, 5])
        compare 7 with find_largest([5])
          base case → return 5
        7 > 5 → return 7
      9 > 7 → return 9
    1 > 9? No → return 9
  3 > 9? No → return 9
return 9

Each recursive call peels off the first element and finds the largest of the rest. The call stack builds up, then unwinds — each level comparing its first element with the largest found deeper in the list.


Solution 4 — using reduce()

Use functools.reduce() to compare pairs of numbers across the whole list.

from functools import reduce

def find_largest(numbers):
    if not numbers:
        return None

    # reduce compares two numbers at a time
    # keeps the larger one and compares it with the next
    return reduce(lambda a, b: a if a > b else b, numbers)


print(find_largest([3, 1, 9, 7, 5]))          # 9
print(find_largest([100, 200, 50, 300, 150]))  # 300
print(find_largest([-5, -1, -8, -3]))          # -1
print(find_largest([42]))                      # 42

Code Execution — Solution 4

Trace through find_largest([3, 1, 9, 7, 5]):

reduce compares pairs left to right, keeping the winner each time:

Stepaba > b?Keeps
1st31Yes3
2nd39No9
3rd97Yes9
4th95Yes9
Done9

Bonus — find largest and its index together

def find_largest_with_index(numbers):
    if not numbers:
        return None, None

    largest = numbers[0]
    largest_index = 0

    for i, number in enumerate(numbers):
        if number > largest:
            largest = number
            largest_index = i

    return largest, largest_index


numbers = [3, 1, 9, 7, 5]
value, index = find_largest_with_index(numbers)
print(f"Largest: {value} at index {index}")
# Largest: 9 at index 2

Which solution to use?

SolutionHowBest when
Solution 1Loop + compareClear, easy to understand
Solution 2Track indexWhen you need position too
Solution 3RecursionUnderstanding recursive thinking
Solution 4reduce()Functional style

Output

9
300
-1
42
None

On this page