2013-02-24 3 views
0

Мне нужен двумерный список для хранения информации о студентах и ​​их оценках.Создайте двумерный список

Когда я запускаю свою программу, я просто получаю один список чисел, но мне нужны отдельные списки для каждого ученика. Может кто-нибудь мне помочь?

Это то, что я сделал до сих пор:

COLS= int(input("number of students to enter ")) 
ROWS= int(input("number of grades per student ")) 

def main(): 
    number =[] 


    for c in range(COLS): 
     student =(input("enter student ID number ")) 
     number.append(student) 

     for r in range (ROWS): 
      grades =(input("Enter grade for module: ")) 
      number.append(grades) 

    print(number) 

my result is 
number of students to enter 2 
number of grades per student 4 
enter student ID number 1234 
Enter grade for module: 55 
Enter grade for module: 66 
Enter grade for module: 43 
Enter grade for module: 33 
enter student ID number 2345 
Enter grade for module: 34 
Enter grade for module: 56 
Enter grade for module: 78 
Enter grade for module: 99 
['1234', '55', '66', '43', '33', '2345', '34', '56', '78', '99'] 
>>> 
+0

Обратите внимание, что вы строите списки здесь и простой и эффективный способ сделать это с помощью [списковых] (HTTP: // WWW .youtube.com/смотреть? v = pShL9DCSIUw). –

ответ

1

Вам нужно создать новый список для каждой строки:

for c in range(COLS): 
    grades = [] 
    student =(input("enter student ID number ")) 
    number.append(student) 
    number.append(grades) 

    for r in range (ROWS): 
     grade =(input("Enter grade for module: ")) 
     grades.append(grade) 
+0

+1, ваш намного чище, чем мой. –

+0

На самом деле это не работает ... когда 'grades' добавляется к' number', он по-прежнему пуст, и 'grades' сам по себе не является ссылкой на элемент, фактически содержащийся в списке, поэтому его изменение не выполняется, t обновить список, содержащийся в 'number'. –

+1

Все в Python является ссылкой, когда вы обновляете 'grades' вне списка, это будет влиять на то, что есть в списке (так как это одно и то же). –

0

Просто построить список, прежде чем вставить его в number:

for c in range(COLS): 
    student =(input("enter student ID number ")) 
    temp_arr = [student] # make a temporary array for the student id and their grades 

    for r in range (ROWS): 
     grades =(input("Enter grade for module: ")) 
     temp.append(grades) # append to the temp array here 

    # after you are done getting the grades 
    # insert the entire temp array into the number array 
    number.append(temp) 

Кроме того, эти данные, вероятно, будут быть сохранены лучше, если вы сделали класс Student, который может содержать id и список grades.

1

Я хотел бы использовать словарь проиндексированы студент ID:

COLS= int(input("number of students to enter ")) 
ROWS= int(input("number of grades per student ")) 

def main(): 
    student_grades = {} 

    for c in range(COLS): 
     student =(input("enter student ID number ")) 
     grades = [] 

     for r in range (ROWS): 
      grade =(input("Enter grade for module: ")) 
      grades.append(grade) 
     student_grades[student] = grades 
+0

+1 Это здесь имеет большой смысл - обратите внимание, что в маловероятном случае порядок, в который они входят, имеет значение, это не будет записывать это ('dict's are unordered). –

+0

Правда! В этом случае вы можете использовать 'collections.OrderedDict'. –

1

В соответствии с моим комментарием, пример делать это с list & dict comprehensions:

cols = int(input("Number of students: ")) 
rows = int(input("Number of grades per student: ")) 

grades = {input("Enter student ID number: "): 
      [input("Enter grade for module: ") for _ in range(rows)] 
      for _ in range(cols)} 

Примечание это словарь, как в Kyle Strand's answer, а не список. Это лучше подходит для данных и упростит работу с ним.

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

rows = int(input("Number of grades per student: ")) 

def get_students(): 
    while True: 
     value = input("Enter student ID number, or nothing to finish: ") 
     if not vale: 
      return 
     else: 
      yield value 

grades = {student: [input("Enter grade for module: ") for _ in range(rows)] 
      for student in get_students()} 

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

0

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

COLS = int(input("number of students: ")) 
ROWS = int(input("number of grades per student: ")) 

grades = {} 

def main(): 
    for c in range(COLS): 
     student = int(input("enter student ID: ")) 
     grades[student] = [] # initialize to empty row of grades 

     for r in range(ROWS): 
      grade = int(input("Enter grade for module: ")) 
      grades[student].append(grade) 

    for student in grades.keys(): 
     print 'student:{}, grades:{}'.format(student, grades[student]) 

выход после ввода ваших данных выборки:

student:2345, grades:[34, 56, 78, 99] 
student:1234, grades:[55, 66, 43, 33] 
Смежные вопросы