簡體   English   中英

Python的二維列表

[英]Two-dimensional lists for Python

函數avgavg()將一個列表作為輸入,該列表的項目是三個數字的列表。 每個三位數列表代表特定學生為課程收到的三個等級。 例如,這是一個四個學生班級的輸入列表(您永遠不知道您將需要處理多少學生):

[[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]

函數avgavg()應該在屏幕上打印兩行。 第一行將包含一個包含每個學生平均成績的列表。 第二行只包含一個數字:平均班級,定義為所有學生平均成績的平均值。

給出以上數據的輸出:

[91.0, 65.0, 87.0, 11.333333333334]
63.5833333333

(這是我的任務問題。我試圖以一些不同的方式開始這個,我似乎無法得到我的輸入連接到任何東西。我將如何解決這個問題?這是我最近的嘗試:COLS = int(輸入( “輸入學生人數:”))ROWS = int(輸入(“輸入每個學生的成績數:”))

def avgavg():
    student_grades = []

    for c in range(COLS):
        student = input("Enter the number of the student: ")
        grades = []

    for r in range (ROWS):
        grade = eval(input("Enter the grades for the student: "))
        grades.append(grade)
    student_grades[student] = grades
    print(grades)

要獲得列表的平均值,比如說[1, 2, 3] ,你可以這樣做:

a = [1, 2, 3]
print sum(a)/float(len(a))

希望這足以讓你開始。 我會讓你弄明白具體細節。 此外,一旦你充分證明你已經嘗試過自己的工作並且無法按預期工作,我將只發布完整的解決方案。

現在你已經展示了一些努力:

工作方案

a = [[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]

b = [sum(i)/float(len(i)) for i in a]

>>> print b
[91.0, 65.0, 87.0, 11.333333333333334]

print sum(b)/float(len(b))
63.5833333333

這是詳細說明sshashank124的答案並添加用戶輸入功能。 我還添加了一些錯誤處理代碼(while循環),因此如果用戶輸入字符串而不是成績,它將再次詢問:

請記住,請勿在提交時使用此確切代碼。 這可能是您班級中的完整性違規行為。 嘗試從頭開始重寫代碼並告訴我哪些方法不順利

你在代碼中做錯了,就是你自己把兩個for循環。 它們需要嵌套。

error = "Non integer input. Try again>> " #Error message

def isfloat(value): #Functon to check if a number can be a grade
    try:
       float(value)
       return True
    except ValueError:
       return False

n = raw_input("Enter number of students>> ") #Number of students
while not n.isdigit():
    n = raw_input(error)

g = raw_input("\nEnter number of grades per student>> ") #Number of Grades per student
while not g.isdigit():
    g = raw_input(error)

grades = [] #The two dimensional list
print
#Receiving input from the user
for a in range(int(n)):
    temp = []
    print "Student %i" % (a+1)
    for b in range(int(g)):
        grade = raw_input("Grade %i>> " % (b+1))
        while not isfloat(grade):
            grade = raw_input(error)
        temp.append(float(grade))
    grades.append(temp)
    print

students = [sum(stud)/float(len(stud)) for stud in grades]
#Returning output
print students
print sum(students)/float(len(students))

我意識到這是一項任務,在現實世界中我會毫不猶豫地使用numpy:

> grades = [[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]
> np.average(grades, axis=1)
array([ 91.        ,  65.        ,  87.        ,  11.33333333])
> np.average(grades)
63.583333333333336

這是工作代碼:

lists = eval(raw_input('Enter the class data as a list: '))

def avgavg(lists):
        avg = [float(sum(sub))/float(len(sub)) for sub in lists]
        everything = [item for sub in lists for item in sub]
        allavg = float(sum(everything))/float(len(everything))
        return avg, allavg

avg, allavg = avgavg(lists)
print avg
print allavg

這運行如下:

bash-3.2$ python lists.py
Enter the class data as a list: [[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]
[91.0, 65.0, 87.0, 11.333333333333334]
63.5833333333
bash-3.2$ 

此代碼使用eval(raw_input(...))獲取輸入以從字符串中刪除引號。 然后,我們用列表解析得到每個人的平均值,然后使用列表解析,使所有列出清單列表一個列表(對不起,所有的名單 :))。 然后我們將它返回,最后打印出來。

不要猶豫,不要在下面提出任何問題!

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM