#python #dictionary
#python #словарь
Вопрос:
Я хочу получить доступ к значениям в кортеже в словаре с помощью лямбда-функции
Мне нужно получить средний средний балл по каждому предмету, сравнивая средние оценки учащихся в этом классе
Я пытался использовать лямбда-выражение, но не смог его понять.
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
Комментарии:
1. Вопрос «Как получить доступ к значению в кортеже?» или «Как вычислить средний средний балл?»
2. извините, он должен сравнивать средний средний балл по каждому предмету, поэтому вывод должен быть [‘math’,’English’]. потому что средний средний балл по математике, который равен 3.0, больше, чем средний средний балл по английскому языку 2.0
3. Вы не ответили на мой вопрос. Что именно вы здесь спрашиваете? Как получить доступ к элементам кортежа или как найти средний средний балл?
4. как найти средний средний балл .. тогда, я думаю, я смогу узнать, как получить доступ к элементам кортежа
5. Взгляните на мой обновленный ответ в этом случае.
Ответ №1:
Вы можете легко отсортировать все, используя sorted
key
функцию with:
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)
Комментарии:
1. Большое спасибо за вашу помощь. Знаете ли вы, как сортировать по числу учеников, если средний балл одинаковый.
2. @KevinLee Что вы подразумеваете под «числом студентов»? Вы имеете в виду количество студентов?
3. @KevinLee Я внес правку, предполагая, что это то, что вы имеете в виду.
Ответ №2:
Одна из проблем с тем, как вы реализовали, заключается в том, что вы использовали a 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
Комментарии:
1. Пожалуйста, исправьте отступ в функции; неясно, что именно вы пытаетесь выполнить прямо сейчас.
2. Исправлен отступ. Я пытался не записывать все решение целиком, а позволить OP вычислить недостающие биты. Из их последующих комментариев казалось, что вычисление среднего значения с использованием значений в кортежах было проблемой. Поэтому обратился именно к этому.