Python/Панды — Для цикла записи только заключительной итерации

#python #pandas #canvas-lms

Вопрос:

Обязательное предупреждение — новичок в Python и Пандах.

У меня возникли некоторые трудности с выполнением цикла for, который возвращает только последнее значение в списке.

У меня есть файл .csv, содержащий информацию, которую я хотел бы запустить через CanvasAPI для публикации результатов пользователей. Макет .csv является:

      Name  user_id  Score
0  Name_0     7454   90.0
1  Name_1     7075   96.0
2  Name_2     7377   76.0
3  Name_3     7259   49.0
4  Name_4     7294   48.0
5  Name_5     7491   76.5
 

Мой код для выполнения цикла таков:

 canvas = Canvas(API_URL, API_KEY)

course = canvas.get_course(9997)

assignment = course.get_assignment(78290)

userlist = [canvas.get_user(user) for user in df['user_id']]
length1 = len(userlist)

for i in range(length1):
    (userlist[i])

scorelist = df['Score']
length2 = len(scorelist)

for x in range(length2):
    (scorelist[x])

submission = assignment.get_submission(userlist[i])
submission.edit(submission={'posted_grade': scorelist[x]})
 

Циклы успешно выполняются, но фактически забивается только последняя строка файла .csv (для Name_5). Чего мне не хватает? Любая помощь будет очень признательна.

Комментарии:

1. это потому, что в submission = assignment.get_submission(userlist[i]) вы используете i, который в последний раз обновлялся в предыдущем цикле и, как вы догадались, соответствует последнему индексу вашего списка

2. Большое спасибо — какое значение я должен заменить для обработки остальной части списка?

Ответ №1:

Проблема в последнем цикле for.

     for x in range(length2):
        (scorelist[x])
 

Каждый раз, когда цикл повторяется, scorelist[x] будет последним значением x. Таким образом, в конце выполнения scorelist[x] будет последним значением x.

Вам нужно будет сохранять значение scorelist[x] при каждом повторении цикла. Один из способов сделать это-добавить значения в список:

     scores = []
    for x in range(length2):
        scores.append(scorelist[x])
 

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

     for i in range(len(userlist)):
       submission = assignment.get_submission(userlist[i])
       submission.edit(submission={'posted_grade': scores[i]})
 

Есть более чистые способы сделать это, но я постарался изменить ваш код как можно меньше.

Комментарии:

1. Большое спасибо за помощь. К сожалению, проблема сохраняется — записывается только конечное значение.

2. Я обновил его, чтобы включить 2-е изменение, которое вам нужно внести, чтобы отправить каждую из этих оценок.