Open In App

Python | Get Top N elements from Records

Sometimes, while working with data, we can have a problem in which we have records and we require to find the highest N scores from it. This kind of application is popular in web development domain. Let’s discuss certain ways in which this problem can be solved. 

Method #1 : Using sorted() + lambda The combination of above functionality can be used to perform this particular task. In this, we just employ sorted function with reverse flag true, and print the top N elements using list slicing. 




# Python3 code to demonstrate working of
# Get Top N elements from Records
# Using sorted() + lambda
 
# Initializing list
test_list = [('Manjeet', 10), ('Akshat', 4), ('Akash', 2), ('Nikhil', 8)]
 
# Initializing N
N = 2
 
# printing original list
print("The original list is : " + str(test_list))
 
# Get Top N elements from Records
# Using sorted() + lambda
res = sorted(test_list, key = lambda x: x[1], reverse = True)[:N]
 
# printing result
print("The top N records are : " + str(res))

Output
The original list is : [('Manjeet', 10), ('Akshat', 4), ('Akash', 2), ('Nikhil', 8)]
The top N records are : [('Manjeet', 10), ('Nikhil', 8)]

Time Complexity: O(n*nlogn) where n is the number of elements in the list “test_list”. list comprehension + inbuilt functions performs n*nlogn number of operations.
Auxiliary Space: O(n), extra space is required where n is the number of elements in the list

  Method #2 : Using sorted() + itemgetter() The combination of above functions can also be used to perform this particular task. In this, the task performed by lambda function is performed by itemgetter() is used to get the index in tuple which has to be included in calculations. 




# Python3 code to demonstrate working of
# Get Top N elements from Records
# Using sorted() + itemgetter()
from operator import itemgetter
 
# Initializing list
test_list = [('Manjeet', 10), ('Akshat', 4), ('Akash', 2), ('Nikhil', 8)]
 
# Initializing N
N = 2
 
# printing original list
print("The original list is : " + str(test_list))
 
# Get Top N elements from Records
# Using sorted() + itemgetter()
res = sorted(test_list, key = itemgetter(1), reverse = True)[:N]
 
# printing result
print("The top N records are : " + str(res))

Output
The original list is : [('Manjeet', 10), ('Akshat', 4), ('Akash', 2), ('Nikhil', 8)]
The top N records are : [('Manjeet', 10), ('Nikhil', 8)]

Time Complexity: O(nlogn), where n is the length of the list test_list 
Auxiliary Space: O(n) additional space of size n is created where n is the number of elements in the res list 

Method #3 : Using heapq.nlargest()
This approach uses the heapq library’s nlargest() function, which returns the top N elements from an iterable. This approach is more efficient than the previous two, as it uses a heap data structure to keep track of the largest elements.




import heapq
 
# Initializing list
test_list = [('Manjeet', 10), ('Akshat', 4), ('Akash', 2), ('Nikhil', 8)]
 
# Initializing N
N = 2
 
# printing original list
print("The original list is : " + str(test_list))
 
# Get Top N elements from Records
# Using heapq.nlargest()
res = heapq.nlargest(N, test_list, key = lambda x: x[1])
 
# printing result
print("The top N records are : " + str(res))
#This code is contributed by Edula Vinay Kumar Reddy

Output
The original list is : [('Manjeet', 10), ('Akshat', 4), ('Akash', 2), ('Nikhil', 8)]
The top N records are : [('Manjeet', 10), ('Nikhil', 8)]

Time complexity: O(n log n) as it uses a heap data structure which is logarithmic in nature 
Auxiliary space: O(n) as it stores the top N elements in memory.

Method #4: Using a dictionary to map the second element of each tuple to the corresponding tuple, and then using a loop to get the top N elements




# Initializing list
test_list = [('Manjeet', 10), ('Akshat', 4), ('Akash', 2), ('Nikhil', 8)]
 
# Initializing N
N = 2
 
# creating a dictionary that maps the second element of each tuple to the corresponding tuple
dict_list = {t[1]: t for t in test_list}
 
# getting the keys in descending order
keys = sorted(dict_list.keys(), reverse=True)
 
# getting the top N tuples
res = []
for i in range(N):
    res.append(dict_list[keys[i]])
 
# printing the result
print("The top N records are : " + str(res))

Output
The top N records are : [('Manjeet', 10), ('Nikhil', 8)]

Time complexity: O(n log n) due to the sorting operation, 
Auxiliary space: O(n) since we’re creating a dictionary to store the tuples.


Article Tags :