Как получить значение в кортеже в словаре?

Я хочу получить доступ к значениям кортежа в словаре с помощью лямбда-функции.

Мне нужно получить средний средний балл по каждому предмету, сравнив средние оценки учеников в этом классе.

Я пытался использовать лямбда, но я не мог понять это.


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.

Является ли вопрос «Как получить доступ к значению в кортеже?» или "Как рассчитать средний средний балл?"

perennial_noob 10.04.2019 03:07

извините, он должен сравнивать средний средний балл по каждому предмету, поэтому вывод должен быть ['математика','английский язык']. потому что средний средний балл по математике, который составляет 3,0, больше, чем средний средний балл по английскому языку 2,0

user11337430 10.04.2019 03:08

Вы не ответили на мой вопрос. Что именно вы здесь спрашиваете? Как получить доступ к элементам кортежа или как найти avg gpa?

perennial_noob 10.04.2019 03:12

как найти avg gpa..тогда я думаю, что смогу узнать, как получить доступ к элементам кортежа

user11337430 10.04.2019 03:16

Взгляните на мой обновленный ответ в этом случае.

perennial_noob 10.04.2019 03:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
143
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Одна из проблем с тем, как вы реализовали, заключается в том, что вы использовали 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

Пожалуйста, исправьте отступ в функции; немного неясно, чего именно вы пытаетесь достичь прямо сейчас.

iz_ 10.04.2019 03:34

Исправил отступ. Я пытался не записывать все решение, а позволить ОП выяснить недостающие биты. Из их последующих комментариев казалось, что вычисление среднего с использованием значений в кортежах было проблемой. Так что обратился именно к этому.

perennial_noob 10.04.2019 04:53
Ответ принят как подходящий

Вы можете легко отсортировать все, используя 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)

Большое вам спасибо за вашу помощь. Знаете ли вы, как сортировать по количеству студентов, если средний балл одинаковый.

user11337430 10.04.2019 04:12

@KevinLee Что вы подразумеваете под «числом студентов»? Вы имеете в виду количество учеников?

iz_ 10.04.2019 04:38

@KevinLee Я внес правку, предполагая, что вы это имеете в виду.

iz_ 10.04.2019 04:39

Другие вопросы по теме