«TypeError: списочные индексы должны быть целыми числами или кусочками, а не dict» в Python 3. Не уверены, почему это происходит, поскольку значения списка являются целыми числами - PullRequest
0 голосов
/ 09 декабря 2018

Я работаю над проектом и получаю ошибку типа, которую я не понимаю, как исправить.Я ищу справку о том, что я пропускаю и как исправить эту ошибку.

Ниже приведена функция, которая создает ошибку.Я напечатал словарь и списки, которые я создал, чтобы вы все могли видеть, что это за данные.Мне кажется, что все индексы в списке являются целыми числами, и именно это меня смущает.

def summarize_points(submissions):
    print(submissions[0])
    pointsPossible = []
    groupWeight = []
    userScore = []   
    for assignment in submissions:
        if assignment['workflow_state'] == 'graded':
            pointsPossible.append(int(assignment['assignment'] 
            ['points_possible']))
            groupWeight.append(int(assignment['assignment']['group'] 
            ['group_weight']))
            userScore.append(int(assignment['score']))
        pass
    pass
    print('\n\n\n\nTest Data \n\n\n')
    print('pointsPossible')
    print(pointsPossible)
    print('\ngroupWeight')
    print(groupWeight)
    print('\nuserScore')
    print(userScore)
    weightedTotalPoints = []
    weightedUserScore = []
    for assignment in submissions:
        weightedtotalPointsAddition = int(pointsPossible[assignment]) * int(groupWeight[assignment])
    weightedTotalPoints.append(weightedtotalPointsAddition)
    weightedUserScoreAddition = int(userScore[assignment]) * int(groupWeight[assignment])
    weightedUserScore.append(weightedUserScoreAddition)
currentGrade = sum(weightedUserScore) / sum(weightedTotalPoints)
currentGrade = round(currentGrade)
print(weightedtotalPoints)
print(weightedUserScore)
print(currentGrade)

Ниже это то, что выводится на консоль

{'missing': False, 'submitted_at': '2017-08-28T23:51:13Z', 'assignment': {'due_at': '2017-08-30T16:20:00Z', 'lock_at': '2017-10-01T00:00:00Z', 'name': '#1.2) Quiz: Introduction', 'id': 270567, 'unlock_at': '2017-08-27T16:40:00Z', 'points_possible': 10.0, 'assignment_group_id': 82390, 'group': {'rules': {}, 'name': 'Learning Quizzes', 'id': 82390, 'group_weight': 25}}, 'assignment_id': 270567, 'late': False, 'attempt': 3, 'grader_id': 10926, 'workflow_state': 'graded', 'score': 9, 'graded_at': '2017-09-12T13:04:04Z', 'seconds_late': -145726, 'excused': False, 'user_id': 42}




Test Data 



pointsPossible
[10, 10, 1, 6, 10, 1, 7, 10, 4, 6, 5, 4, 7, 4, 5, 7, 5, 4, 3, 10, 2, 7, 6, 10, 7, 5, 10, 4, 6, 5, 0, 5, 16, 7, 3, 6, 5, 10, 10, 10, 5, 7, 5, 9, 4, 5, 6, 2, 21, 6, 5, 10, 3, 4, 9, 4, 6, 2, 5, 6, 17, 8, 5, 11, 4, 14, 3, 5, 7, 3, 4, 9, 4, 8, 3, 5, 3, 7, 10, 5, 10, 7, 7, 7, 10, 9, 9, 5, 5, 5]

groupWeight
[25, 25, 10, 25, 25, 25, 25, 10, 25, 10, 25, 10, 25, 25, 10, 10, 10, 25, 25, 25, 10, 25, 25, 25, 25, 10, 25, 25, 25, 25, 25, 10, 25, 25, 25, 25, 10, 25, 25, 25, 25, 25, 10, 25, 25, 25, 25, 10, 25, 25, 10, 25, 25, 25, 25, 25, 10, 10, 25, 10, 25, 25, 10, 25, 25, 25, 25, 25, 25, 10, 25, 25, 25, 25, 25, 10, 10, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 10]

userScore
[9, 9, 0, 5, 9, 0, 6, 9, 3, 5, 4, 3, 6, 3, 4, 6, 4, 3, 2, 9, 1, 7, 5, 9, 6, 4, 9, 3, 5, 4, 0, 4, 14, 6, 2, 5, 4, 9, 9, 9, 4, 6, 4, 8, 3, 4, 5, 1, 19, 5, 4, 9, 2, 3, 8, 3, 5, 1, 4, 5, 15, 7, 4, 10, 3, 13, 2, 4, 6, 2, 3, 8, 3, 7, 2, 4, 2, 6, 9, 4, 9, 6, 6, 6, 9, 8, 8, 4, 4, 4]

Нижеэто ошибка

File "path", line 97, in summarize_points
weightedtotalPointsAddition = int(pointsPossible[assignment]) * 
int(groupWeight[assignment])

TypeError: list indices must be integers or slices, not dict

1 Ответ

0 голосов
/ 09 декабря 2018

Проблема ясна: ваша assignment переменная dict, как показывает print(submissions[0]), а поскольку pointsPossible - список, вы должны ввести integer или slice для вызова элементовот него.Таким образом, даже если ваш list состоит из integers, когда вы звоните list[index], это index, который должен содержать integer или slice.

Проверка вашего кода, я 'Я предполагаю, что вы пытаетесь использовать значение из points_possible, которое находится в вашем dict assignment.Одна непонятная вещь - это то, что вы назвали элементы из submission как assignment, что совпадает с именем одного из ваших ключей JSON, так что это путаница.

Чтобы вызвать правильный элемент из вашего json, вы должны вызвать dictName["assignment"]["points_possible"].

Когда вы вызываете цикл for, вы вызываете каждый элемент из submissions какassignment также.

Таким образом, правильный вызов будет: assignment["assignment"]["points_possible"]

Чтобы достичь того, что вы хотите, просто измените int(pointsPossible[assignment]) на pointPossible[int(assignment["assignment"]["points_possible"])], что должно сработать.

Если вы хотите получить доступ к другому элементу из вашего dict, но внутри клавиши assignment в вашем диктофоне, просто измените points_possible на правильный.

PS: В случае, еслиВы столкнулись с другой проблемой, просто дайте мне знать, и я обновлю код здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...