2012-04-13 4 views
0

У меня есть этот словарь, в котором хранятся пары двух оценочных баллов и идентификаторов участников. Структура {(quiz1, quiz2): ID}Доступ к кортежам в словаре

scoredict = {('83', '93'): '81937', ('88', '86'): '33576', ('96', '97'): '01084', 
('81', '95'): '48534', ('84', '72'): '11235', ('77', '80'): '01835', ('90', '83'): 
'39488', ('75', '74'): '31049', ('80', '62'): '10188', ('85', '86'): '63011', 
('66', '89'): '58272'} 

Я хочу, чтобы сделать эту программу, чтобы искать для ID, введя пару экзаменационных оценок. Например, если пользователь вводит 83 и 93 для викторины 1 и викторины 2, он вернется 81937. Я работал над этим с последних 48 часов, но ни один из моих кодов не работал ...

И можно ли найти самые близкие доступные баллы для обоих викторин и распечатать идентификатор?

ответ

4

Я проверил свое решение уже работает с ipython:

In [1]: scoredict = {('83', '93'): '81937', ('88', '86'): '33576', ('96', '97'): '01084', 
    ...: ('81', '95'): '48534', ('84', '72'): '11235', ('77', '80'): '01835', ('90', '83'): 
    ...: '39488', ('75', '74'): '31049', ('80', '62'): '10188', ('85', '86'): '63011', 
    ...: ('66', '89'): '58272'} 

In [2]: scoredict['83','93'] 
Out[2]: '81937' 
+0

О мой Плохо. Спасибо, что дали мне знать! – DarsAE

1

Для ближайших баллов, вы можете попробовать это:

test = (83, 93) 

deviation = float('inf') 
best_match = None 

for score1, score2 in scoredict: 
    error = abs(int(score1) - test[0]) + abs(int(score2) - test[1]) 

    if error < deviation: 
    deviation = error 
    best_match = (score1, score2) 

print scoredict[best_match] 
+0

Я попытался использовать этот метод, но я получил эту ошибку: ValueError: недействительный литерал для int() с базой 10: '-140.0' – DarsAE

+0

Используйте 'float()' вместо 'int()', если вы используете с плавающей запятой номера. – Blender

Смежные вопросы