Python - K Maximum Elements with Index in List

Finding the k maximum elements with their indices from a list is a common programming task in Python. This article explores multiple approaches using built-in functions, libraries like NumPy and Pandas, and different algorithms to solve this problem efficiently.

Using Brute Force Method

The brute force approach repeatedly finds the maximum element, stores its value and index, then replaces it to find the next maximum ?

def k_max_elements(data, k):
    data_copy = data.copy()  # Work with copy to preserve original
    result = []
    
    for _ in range(k):
        max_value = max(data_copy)
        max_index = data_copy.index(max_value)
        result.append((max_value, max_index))
        data_copy[max_index] = float('-inf')
    
    return result

numbers = [10, 5, 8, 12, 3]
k = 3
result = k_max_elements(numbers, k)
print(f"Original list: {numbers}")
print(f"Top {k} elements: {result}")
Original list: [10, 5, 8, 12, 3]
Top 3 elements: [(12, 3), (10, 0), (8, 2)]

Using Recursion

A recursive solution breaks the problem into smaller subproblems with a base case when k equals 0 ?

def k_max_elements_recursive(data, k):
    if k == 0:
        return []
    
    data_copy = data.copy()
    max_value = max(data_copy)
    max_index = data_copy.index(max_value)
    data_copy[max_index] = float('-inf')
    
    remaining = k_max_elements_recursive(data_copy, k - 1)
    return [(max_value, max_index)] + remaining

numbers = [7, 5, 4, 8, 9, 6, 2, 1]
k = 4
result = k_max_elements_recursive(numbers, k)
print(f"Original list: {numbers}")
print(f"Top {k} elements: {result}")
Original list: [7, 5, 4, 8, 9, 6, 2, 1]
Top 4 elements: [(9, 4), (8, 3), (7, 0), (6, 5)]

Using heapq Module

The heapq module provides efficient heap operations. We maintain a min-heap of size k to track the largest elements ?

import heapq

def k_max_elements_heap(data, k):
    result = []
    
    for i, value in enumerate(data):
        if len(result) < k:
            heapq.heappush(result, (value, i))
        else:
            # Replace smallest if current value is larger
            if value > result[0][0]:
                heapq.heappushpop(result, (value, i))
    
    return sorted(result, reverse=True)

numbers = [10, 5, 8, 12, 3]
k = 3
result = k_max_elements_heap(numbers, k)
print(f"Original list: {numbers}")
print(f"Top {k} elements: {result}")
Original list: [10, 5, 8, 12, 3]
Top 3 elements: [(12, 3), (10, 0), (8, 2)]

Using NumPy

NumPy's argpartition efficiently finds indices of the k largest elements without full sorting ?

import numpy as np

def k_max_elements_numpy(data, k):
    arr = np.array(data)
    indices = np.argpartition(arr, -k)[-k:]
    result = [(data[i], i) for i in indices]
    return sorted(result, reverse=True)

numbers = [4567, 7, 443, 456, 56, 5467, 74]
k = 4
result = k_max_elements_numpy(numbers, k)
print(f"Original list: {numbers}")
print(f"Top {k} elements: {result}")
Original list: [4567, 7, 443, 456, 56, 5467, 74]
Top 4 elements: [(5467, 5), (4567, 0), (456, 3), (443, 2)]

Using enumerate() and sorted()

Combine enumerate() with sorted() and lambda functions for a clean one-liner approach ?

def k_max_elements_sorted(data, k):
    # Sort by value in descending order, keep original indices
    sorted_pairs = sorted(enumerate(data), key=lambda x: x[1], reverse=True)
    result = [(value, index) for index, value in sorted_pairs[:k]]
    return result

numbers = [45, 7, 4, 46, 56, 5467, 74]
k = 4
result = k_max_elements_sorted(numbers, k)
print(f"Original list: {numbers}")
print(f"Top {k} elements: {result}")
Original list: [45, 7, 4, 46, 56, 5467, 74]
Top 4 elements: [(5467, 5), (74, 6), (56, 4), (46, 3)]

Using Pandas

Pandas provides powerful data manipulation methods like nlargest() for finding top elements ?

import pandas as pd

def k_max_elements_pandas(data, k):
    df = pd.DataFrame({'value': data, 'index': range(len(data))})
    top_k = df.nlargest(k, 'value')
    result = list(zip(top_k['value'], top_k['index']))
    return sorted(result, reverse=True)

numbers = [45, 7, 4, 46, 56, 5467, 74]
k = 4
result = k_max_elements_pandas(numbers, k)
print(f"Original list: {numbers}")
print(f"Top {k} elements: {result}")
Original list: [45, 7, 4, 46, 56, 5467, 74]
Top 4 elements: [(5467, 5), (74, 6), (56, 4), (46, 3)]

Performance Comparison

Method Time Complexity Space Complexity Best For
Brute Force O(k * n) O(k) Small datasets
heapq O(n * log(k)) O(k) Large datasets, small k
NumPy O(n + k * log(k)) O(k) Numeric data
sorted() O(n * log(n)) O(n) Readability
Pandas O(n * log(k)) O(n) Data analysis

Conclusion

For large datasets with small k values, use heapq for optimal performance. For numeric data, NumPy's argpartition is efficient. Choose sorted() with enumerate() for simple, readable code when performance isn't critical.

Updated on: 2026-03-27T08:32:26+05:30

771 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements