2013-02-24 78 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

请注意,您在这里的楼宇名单,以及一个简单而有效的方式做到这一点是使用[list解析](HTTP:// WWW .youtube.com /手表?ν= pShL9DCSIUw)。 – 2013-02-24 18:11:37

回答

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,你比我的清洁得多。 – 2013-02-24 18:06:58

+0

这实际上看起来并不奏效......当'数量'附加到'数量'时,它仍然是空的,'成绩'本身不是对列表中实际包含的项目的引用,所以改变它不会' t更新'number'中包含的列表。 – 2013-02-24 18:14:29

+1

Python中的所有东西都是一个引用,当你在列表外部更新“成绩”时,它也会影响列表中的内容(因为它们是相同的东西)。 – 2013-02-24 18:17:53

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

我会用通过学生证指数的字典:

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是无序的)。 – 2013-02-24 18:10:59

+0

真的!在那种情况下,你可以使用'collections.OrderedDict'。 – 2013-02-24 18:15:20

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]