鑒于以下串列:
student_marks = [['Name', ['A','B','C','D','E']],
['Ankit', [41, 34, 45, 55, 63]],
['Aravind',[42, 23, 34, 44, 53]],
['Lakshay',[32, 23, 13, 54, 67]],
['Gyan', [23, 82, 23, 63, 34]],
['Pranav', [21, 23, 25, 56, 56]]
]
如果考慮學生的前 4 門科目,我試圖找出誰得分最高(前 4 名的平均分)。我們需要比較每個學生的前 4 名平均分,并找出誰的百分比最高。
這就是我所做的:
best_four_marks = []
for i in student_marks[1:]:
student_name = i[0]
count_1 = 0
summ_1 = 0
for j in i[1]:
if j > min(i[1]):
count_1 = 1
summ_1 = j
avg = summ_1/count_1
best_four_marks.append([avg,student_name])
這里的問題是,其中一名學生,即 Gyan,有 2 個相同的值,即科目 A 和科目 C 的 23 分。我已指示編譯器忽略最差分數,以計算每個學生的前 4 個科目百分比. 在 Gyan 的迭代中,它完全忽略了 5 個受試者中的 2 個最低值。我想包括其中之一,因為我們需要前 4 名科目的百分比。
期待聽到您的反饋!謝謝。
uj5u.com熱心網友回復:
您可以通過從總和中僅減去最低分數來解決問題。
best_four_marks = []
for i in student_marks[1:]:
student_name = i[0]
summ_1 = sum(i[1]) - min(i[1])
count_1 = len(i[1])-1
avg = summ_1/count_1
best_four_marks.append([avg,student_name])
uj5u.com熱心網友回復:
student_marks = [
['Name', ['A','B','C','D','E']],
['Ankit', [41, 34, 45, 55, 63]],
['Aravind',[42, 23, 34, 44, 53]],
['Lakshay',[32, 23, 13, 54, 67]],
['Gyan', [23, 82, 23, 63, 34]],
['Pranav', [21, 23, 25, 56, 56]]
]
avg_marks = {}
for marks in student_marks[1:]: # ignore first entry
student = marks[0]
top_4_marks = sorted(marks[1], reverse=True)[:-1]
total_of_top_4_marks = sum(top_4_marks)
avg_marks[student] = total_of_top_4_marks/4
avg_marks
輸出
{'Ankit': 51.0,
'Aravind': 43.25,
'Lakshay': 44.0,
'Gyan': 50.5,
'Pranav': 40.0}
uj5u.com熱心網友回復:
可能不是最干凈的方式,但我會這樣做sorted()
像這樣的東西...
for student in student_marks[1:]:
student_name = student[0]
grades_count = len(student[1]) - 1
grades = sorted(student[1][1:])
student_average = 0
for grade in grades:
student_average = student_average grade
student_average = student_average / grades_count
best_four_marks.append([student_name, student_average])
我會避免第二個回圈,只需使用
student_average = sum(grades) / grades_count
uj5u.com熱心網友回復:
也許這個解決方案具有高度可讀性且易于更改
student_marks = [['Name', ['A', 'B', 'C', 'D', 'E']],
['Ankit', [41, 34, 45, 55, 63]],
['Aravind', [42, 23, 34, 44, 53]],
['Lakshay', [32, 23, 13, 54, 67]],
['Gyan', [23, 82, 23, 63, 34]],
['Pranav', [21, 23, 25, 56, 56]]
]
output = []
for student in student_marks:
student_name = student[0]
list_marks = student[1]
# Check if string exists in the mark list
if any(isinstance(element, str) for element in list_marks):
continue
list_marks = sorted(list_marks, reverse=True)[:-1] # remove the lowest mark
average_mark = sum(list_marks) / len(list_marks)
output.append([student_name, average_mark])
uj5u.com熱心網友回復:
因為你想得到平均5分中的4分,所以這對每個學生來說都是更好的代碼
def getBest4Average(listScore):
return (sum(listScore) - min(listScore))/4
getBest4Average([20, 30, 10, 50, 60])
結果:
40.0
如果你想要一個從 n 中計算( n -1)的版本
def getBestAverage(listScore):
size = len(listScore)
return (sum(listScore) - min(listScore))/(size - 1)
如果您希望>n 個元素串列中的 n 個最好,如果n很小,則此方法將具有更好的性能
def popmax(l):
m = max(l)
l.remove(m)
return m
def GetNBestAverage(listScore, n):
best = []
__listScore = list(listScore) # i do not want to hurt the original list
for i in range(0, n):
best.append(popmax(__listScore))
return sum(best) / len(best)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425605.html
標籤:Python python-3.x 列表 python-2.7
上一篇:如何打破打字稿地圖
