2013-02-24 37 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]