Python program to find the second largest number in a list

Finding the second largest number in a list is a common programming task. Python offers several approaches, each with different trade-offs in terms of readability, efficiency, and handling of edge cases.

Using set() and remove() Functions

This approach converts the list to a set to remove duplicates, then removes the maximum element to find the second largest ?

numbers = [11, 22, 1, 2, 5, 67, 21, 32]

# Convert to set to get unique elements
unique_numbers = set(numbers)
# Remove the largest element
unique_numbers.remove(max(unique_numbers))
# Find the maximum of remaining elements
second_largest = max(unique_numbers)

print("Second largest number:", second_largest)
Second largest number: 32

Using sort() Method with Negative Indexing

Sort the list and access the second-to-last element using negative indexing ?

numbers = [11, 22, 1, 2, 5, 67, 21, 32]

# Sort the list in ascending order
numbers.sort()
print("Sorted list:", numbers)

# Access second largest (second-to-last element)
second_largest = numbers[-2]
print("Second largest element:", second_largest)
Sorted list: [1, 2, 5, 11, 21, 22, 32, 67]
Second largest element: 32

Using Single-Pass Algorithm

This approach finds both the largest and second largest in a single iteration without sorting ?

numbers = [11, 22, 1, 2, 5, 67, 21, 32]

# Initialize first two elements
if len(numbers) < 2:
    print("List needs at least 2 elements")
else:
    largest = max(numbers[0], numbers[1])
    second_largest = min(numbers[0], numbers[1])
    
    # Check remaining elements
    for i in range(2, len(numbers)):
        if numbers[i] > largest:
            second_largest = largest
            largest = numbers[i]
        elif numbers[i] > second_largest and numbers[i] != largest:
            second_largest = numbers[i]
    
    print("Second largest number:", second_largest)
Second largest number: 32

Handling Edge Cases

Consider lists with duplicates or insufficient elements ?

def find_second_largest(numbers):
    if len(numbers) < 2:
        return "List must have at least 2 elements"
    
    unique_numbers = list(set(numbers))
    if len(unique_numbers) < 2:
        return "All elements are the same"
    
    unique_numbers.sort(reverse=True)
    return unique_numbers[1]

# Test with different cases
test_cases = [
    [5, 5, 5, 5],  # All same elements
    [10],          # Single element
    [3, 1, 4, 1, 5, 9, 2, 6]  # Normal case
]

for case in test_cases:
    result = find_second_largest(case)
    print(f"List {case}: {result}")
List [5, 5, 5, 5]: All elements are the same
List [10]: List must have at least 2 elements
List [3, 1, 4, 1, 5, 9, 2, 6]: 6

Comparison of Methods

Method Time Complexity Space Complexity Handles Duplicates
set() + remove() O(n) O(n) Yes
sort() + indexing O(n log n) O(1) No
Single-pass O(n) O(1) Yes

Conclusion

Use the set() approach for simple cases with duplicates. The single-pass algorithm is most efficient for large lists. Choose the sort() method when you need the list sorted anyway for other operations.

Updated on: 2026-03-25T07:01:38+05:30

5K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements