Extracting the Minimum x Value Keys from Dictionary

Question:

Suppose we wish to extract the minimum value from a dictionary like so

scores = {
    0:1.3399288498085087,
    1:1.2672683347433629,
    3:1.6999159970296505, 
    4:1.8410942584597279,
    5:1.336658057628646
}

#find minimum value in dictionary
minimum_value = min(scores.values())

#get keys with minimal value using list comprehension
minimum_keys = [key for key in scores if scores[key]==minimum_value]

minimum_keys

This returns the key with the lowest value. However, what if I wish to extract the minimum 2 keys and put them into a list? What if I wanted the minimum 20? How would I go about doing this for an arbitrary number of minimal values desired?

Asked By: Jared Greathouse

||

Answers:

In fact, the problem is simpler than you think:

scores = {
    0:1.3399288498085087,
    1:1.2672683347433629,
    3:1.6999159970296505, 
    4:1.8410942584597279,
    5:1.336658057628646
}

# minimum key
print(min(scores, key=scores.get))

# n minimum keys
print(sorted(scores, key=scores.get)[:3])

Output:

1
[1, 5, 0]

Both min and sorted allow you to provide a key which is some function to be called with a value, to compute an associated value to be used for sorting. By providing scores.get as that function, you can sort keys by their matching value, which is what you want.

Answered By: Grismar

It can be solved as below:

# your dictionary
scores = {
    0:1.3399288498085087,
    1:1.2672683347433629,
    3:1.6999159970296505, 
    4:1.8410942584597279,
    5:1.336658057628646
}

# a list to store keys
min_keys = []

# how many minimum keys you need
count = 2

# iterate over dict items, sorted based on values 
for key,val in sorted(scores.items(), key=lambda x:x[1])[:count]:
    min_keys.append(key)
    
print(min_keys)
# prints [1,5]
Answered By: rajkumar_data

To extract the minimum k keys with their corresponding values, you can use the heapq.nsmallest() method. Here’s an example of how to use it:

import heapq

scores = {
    0:1.3399288498085087,
    1:1.2672683347433629,
    3:1.6999159970296505, 
    4:1.8410942584597279,
    5:1.336658057628646
}

k = 2  # number of keys to extract

# extract the k keys with the smallest values
minimum_items = heapq.nsmallest(k, scores.items(), key=lambda x: x[1])

# create a list of the k keys
minimum_keys = [item[0] for item in minimum_items]

# create a list of the k values
minimum_values = [item[1] for item in minimum_items]

print(minimum_keys)
print(minimum_values)

This will output:

[1, 0]
[1.2672683347433629, 1.3399288498085087]

Note that heapq.nsmallest() returns a list of tuples containing the key-value pairs of the smallest k items. We use a lambda function to specify that the key for comparison should be the second element of each tuple (the value). Then, we extract the keys and values separately into two lists using list comprehensions.

Answered By: miharbi98
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.