Я хочу получить доступ к значениям кортежа в словаре с помощью лямбда-функции.
Мне нужно получить средний средний балл по каждому предмету, сравнив средние оценки учеников в этом классе.
Я пытался использовать лямбда, но я не мог понять это.
grade = {'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F' : 0.0}
subjects = {'math': {('Jack', 'A'),('Larry', 'C')}, 'English': {('Kevin', 'C'),('Tom','B')}}
def highestAverageOfSubjects(subjects):
return
Результат должен быть ['math','English']
, так как средний средний балл по математике, который составляет 3,0, больше, чем средний средний балл по английскому языку 2,0.
извините, он должен сравнивать средний средний балл по каждому предмету, поэтому вывод должен быть ['математика','английский язык']. потому что средний средний балл по математике, который составляет 3,0, больше, чем средний средний балл по английскому языку 2,0
Вы не ответили на мой вопрос. Что именно вы здесь спрашиваете? Как получить доступ к элементам кортежа или как найти avg gpa?
как найти avg gpa..тогда я думаю, что смогу узнать, как получить доступ к элементам кортежа
Взгляните на мой обновленный ответ в этом случае.
Одна из проблем с тем, как вы реализовали, заключается в том, что вы использовали set
как значения в своем subject
dict. Это означает, что вы должны варьировать каждый элемент. Но как только у вас есть элемент, это значение будет просто проиндексировано как elem[1]
.
Например:
Grade = {'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F' : 0.0}
subject = {'math': {('Jack', 'A'),('Larry', 'C')}, 'English': {('Kevin', 'C'),('Tom','B')}}
for elem in subject['math']:
print(elem[1])
Выход:
C
A
Если в print
выше вы просто print(elem)
то вы увидите что-то вроде:
('Larry', 'C')
('Jack', 'A')
Таким образом, вы можете легко расширить свою реализацию highAveSub(subject)
, чтобы получить то, что вы хотите.
Чтобы найти среднюю оценку предмета:
def highAveSub(subname):
total = 0
for elem in subject[subname]: #Because your values are of type set, not dict.
total = total + grade[elem[1]] #This is how you will cross-reference the numerical value of the grade. You could also simply use enums and I'll leave that to you to find out
avg = total / len(subject[subname])
return avg
Пожалуйста, исправьте отступ в функции; немного неясно, чего именно вы пытаетесь достичь прямо сейчас.
Исправил отступ. Я пытался не записывать все решение, а позволить ОП выяснить недостающие биты. Из их последующих комментариев казалось, что вычисление среднего с использованием значений в кортежах было проблемой. Так что обратился именно к этому.
Вы можете легко отсортировать все, используя sorted
с функцией key
:
Grade = {'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F' : 0.0}
subject = {'math': {('Jack', 'A'),('Larry', 'C')}, 'English': {('Kevin', 'C'),('Tom','B')}}
result = sorted(subject, key=lambda x: sum(Grade[g] for _, g in subject[x]) / len(subject[x]), reverse=True)
print(result)
Выход:
['math','English']
Если в качестве вторичного вы хотите отсортировать по количеству студентов:
result = sorted(subject, key=lambda x: (sum(Grade[g] for _, g in subject[x]) / len(subject[x]), len(subject[x])), reverse=True)
print(result)
Большое вам спасибо за вашу помощь. Знаете ли вы, как сортировать по количеству студентов, если средний балл одинаковый.
@KevinLee Что вы подразумеваете под «числом студентов»? Вы имеете в виду количество учеников?
@KevinLee Я внес правку, предполагая, что вы это имеете в виду.
Является ли вопрос «Как получить доступ к значению в кортеже?» или "Как рассчитать средний средний балл?"