2016-01-23 6 views
0

Я попытался сэкономить 3 последних результата в списке, а затем добавить этот список в список основных классов, создав список списков с каждым учащимся и их баллы в виде отдельного списка. Коду удается добавить оценки в существующий список, но не отображает первый балл и удаляет его до добавления 3 баллов. Может кто-нибудь мне помочь?Хранение последних 3 баллов?

Student = [] #new list created each time for student 
max_scores = 3 #3 scores only at a time in the student's list 

if ClassName == "10x1": #if student's input for class is 10x1 
    for userName in Class10x1: 
     if userName in Student and len(str(score)) >= max_scores: 
      Student.pop([1]) #removes second element in list 
      Student.append(score) #adds most recent score 
      break #stops code 
     elif userName in Student and len(str(score)) < max_scores: 
      Student.append(score) 
      break 
     else: 
      Student.append(userName) 
      Student.append(score) 
      break 
    Class10x1.append(Student) #student's list is appended to main class list 

Приведенный выше код печатается так:

[[]] 
[['Jagraj', 1], ['Jagraj', 1]] 
[['Jagraj', 1, 3], ['Jagraj', 1, 3], ['Jagraj', 1, 3]] 

Однако я хочу, чтобы напечатать это следующим образом:

[['Jagraj', 0, 1, 3]] 

И то, как только студент 4-го теста, первый счет удаляется, поэтому становится [['Jagraj', 1, 3, 5]] Есть ли способ сделать это или мне нужно восстановить способ хранения данных?

+0

Что такое оценка выглядит? len (str (оценка)) очень беспокоит меня – Dionys

+0

Его просто целое число, сгенерированное после того, как тест был принят –

+0

'len (str (оценка))' возвращает количество разрядов баллов. Я не думаю, что это то, что вы пытаетесь проверить. может быть, len (student) + 1> = max_scores'? – Dionys

ответ

2

Вы не должны использовать заметки Camelcase в Python, если вы не пишете классы, которыми вы не являетесь. Это становится путаным при чтении кода. Прочтите инструкции PEP8 для соглашений об именах в Python. https://www.python.org/dev/peps/pep-0008/

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

Прежде всего, не используйте вложенные списки, а вместо этого используйте словарь (hashmap). С ними будет легче справиться.

Допустим, у нас есть объект словаря:

from collections import deque 

a={"ishaan":deque(maxlen=3)} 
a['ishaan'].append(1) 
a['ishaan'].append(2) 
a['ishaan'].append(3) 

тогда все, что мне нужно сделать, чтобы добавить счет в это:

new_score=5 
a['ishaan'].append(new_score) 
print(a) 

Это напечатает

{'ishaan':[2,3,5]} 

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

+0

Спасибо, я думаю, что я буду использовать словари вместо списков, им кажется, что их легче манипулировать, например, удалять и добавлять данные. –

+1

«deque» с maxlen = 3 упростит сохранение только 3 последних результатов. – M4rtini

+0

Это правда. Редактирование моего ответа. Благодарю. – ishaan

0

не могло бы быть проще хранить полный список оценок в объекте студента, а затем только разрешить ему печатать часть его по индексам?

class Student: 
    def __init__(self, studentname): 
     self.Name = studentname 
     self.Grades = [] 

    def last3grade(self): 
     return [self.Name, Grades[len(self.Grades)-1],Grades[len(self.Grades)-2],Grades[len(self.Grades)-3] 
+1

return [self.Name, self.Grades [-3:]] будет более читаемым;) – Dionys

+0

Где я должен реализовать этот код[email protected] –

+0

@Jagraj Singh, 'def last3grade (self): return [self.Name ...' – Dionys