Reputation: 185
I have this dictionary in which in which (key1, key2): value
dict = {('1', '4'): 'A', ('3', '8'): 'B', ('4', '7'): 'C',
('8', '9'): 'D', ('4', '2'): 'E', ('2', '0'): 'F', ('3', '9'):
'G', ('7', '7'): 'H', ('8', '6'): 'I', ('5', '3'): 'J',
('6', '1'): 'K'}
key1 = input('enter value of key1: ')
key2 = input('enter value of key2: ')
If I input a pair of key1, key2 and the pair doesn't exist, is there any way that I can loop through this dictionary and pass a math function i.e. to find average value for each pair of keys and print the one that has the biggest average value?
Edit: Actually this dictionary was derived from a text file, so it has to be in string first and I need to convert it to int but I don't know how.
Upvotes: 3
Views: 3398
Reputation: 77484
# Use NumPy. It seems this will help if you'll be needing argmin type functions.
# This is BY NO MEANS the only way to do it in Python, but it is a good way to
# know nonetheless.
import numpy as np
my_dict = {('1', '4'): 'A', ('3', '8'): 'B', ('4', '7'): 'C',
('8', '9'): 'D', ('4', '2'): 'E', ('2', '0'): 'F', ('3', '9'):
'G', ('7', '7'): 'H', ('8', '6'): 'I', ('5', '3'): 'J',
('6', '1'): 'K'}
# Get the keys
dict_keys = my_dict.keys()
# Get the average value of each key pair.
averages_for_keys = np.array([np.mean(elem) for elem in dict_keys])
# Get the index and the key pair of the largest average.
largest_average_key = dict_keys[averages_for_keys.argmax()]
# Get user input
key1 = input('enter value of key1: ')
key2 = input('enter value of key2: ')
# If not in dict_keys, print for largest average key pair.
if (key1, key2) not in dict_keys:
print "Invalid input key pair. Proceeding with largest average."
print my_dict[largest_average_key]
###
# An alternative to index on the closest key by Euclidean distance.
# This can be adjusted for other distances as well.
###
if (key1, key2) not in dict_keys:
print "Didn't find key pair in dict."
print "Proceeding with keypair of minimal distance to input."
dists = np.array([sqrt((elem[0]-key1)**2.0 + (elem[1]-key2)**2.0) for elem in dict_keys])
min_index = dists.argmin()
closest_key = dict_keys[min_index]
print my_dict[closest_key]
Upvotes: 0
Reputation: 176950
Don't call it dict
, that prevents you from accessing the built-in dict
.
Your keys are str
ings, so there is no average value. If we convert to int
s:
dct = dict((tuple(map(int, key)), value) for key, value in str_dict.iteritems())
Which gives:
dct = {(8, 9): 'D', (4, 7): 'C', (6, 1): 'K', (7, 7): 'H',
(1, 4): 'A', (3, 8): 'B', (2, 0): 'F', (3, 9): 'G',
(4, 2): 'E', (8, 6): 'I', (5, 3): 'J'}
Then you can use max
on the sum
of each key:
key = max(d, key=sum)
# (8, 9) is the key with the highest average value
Since the one with the highest sum
also has the highest average.
If you then want the value for that key, it's:
value = dct[key]
# 'D' is the value for (8, 9)
Upvotes: 4