2016-11-19 54 views
0

以下代碼顯示學生人數和學生分數。多維列表排序[多列]

def main(): 
    answers = [ 
     ['A', 'B', 'A', 'C', 'C', 'D', 'E', 'E', 'A', 'D'], 
     ['D', 'B', 'A', 'B', 'C', 'A', 'E', 'E', 'A', 'D'], 
     ['E', 'D', 'D', 'A', 'C', 'B', 'E', 'E', 'A', 'D'], 
     ['C', 'B', 'A', 'E', 'D', 'C', 'E', 'E', 'A', 'D'], 
     ['A', 'B', 'D', 'C', 'C', 'D', 'E', 'E', 'A', 'D'], 
     ['B', 'B', 'E', 'C', 'C', 'D', 'E', 'E', 'A', 'D'], 
     ['B', 'B', 'A', 'C', 'C', 'D', 'E', 'E', 'A', 'D'], 
     ['E', 'B', 'E', 'C', 'C', 'D', 'E', 'E', 'A', 'D']] 

    keys = ['D', 'B', 'D', 'C', 'C', 'D', 'A', 'E', 'A', 'D'] 

    for i in range(len(answers)): 
     correctCount = 0 
     for j in range(len(answers[i])): 
      if answers[i][j] == keys[j]: 
       correctCount += 1 


     results = [i,correctCount] 
     print(results, end = "") # this line used to be - print("Student", i, "'s correct count is", correctCount) 


main() 

我的目標是將學生分數從低到高排序,而不會混淆與該分數相關的學生數。我試圖使用排序功能對這些形式:

results1 = sorted(results, key = lambda x: x[1]) 
results.sort(key = itemgetter(1)) 
results.sort() 

使用所有這三個嘗試我依然無法使其工作的。有任何想法嗎?

預期輸出:

[3, 4] 
[2, 5] 
[1, 6] 
[0, 7] 
[5, 7] 
[6, 7] 
[7, 7] 
[4, 8] 

第一列是學生#,第二列是分數。

+0

你是什麼預期產出?你知道每次你的意思是'results.append([i,correctCount])'覆蓋'結果''。 – AChampion

+0

編輯的問題包括預期輸出。 –

回答

1

您還沒有建設的results列表,results = [i, correctCount]只是覆蓋的結果,你需要:

results = [] 
for i in range(len(answers)): 
    correctCount = 0 
    for j in range(len(answers[i])): 
     if answers[i][j] == keys[j]: 
      correctCount += 1 
    results.append([i, correctCount]) 
results = sorted(results, key=lambda x: x[1]) 

那麼你的排序代碼應工作。

然而,更地道的Python是遍歷實際列表主場迎戰range(len(list)),通常可以簡化你的代碼,上面可以改寫:

results = [] 
for student, student_answers in enumerate(answers): 
    correctCount = 0 
    for answer, key in zip(student_answers, keys): 
     if answer == key: 
      correctCount += 1 
    results.append([student, correctCount]) 
results = sorted(results, key=lambda x: x[1]) 

這比原來的代碼更易讀。
您還可以使用內涵和發電機的減少碳排放量

results = [] 
for student, student_answers in enumerate(answers): 
    results.append([student, sum(ans == key for ans, key in zip(student_answers, keys)]) 
results = sorted(results, key=lambda x: x[1]) 

如果你真的想要去這麼遠,你可以做整個事情一氣呵成:

results = sorted(((student, sum(a == k for a, k in zip(ans, keys))) 
        for student, ans in enumerate(answers)), key=lambda x: x[1]) 
# [(3, 4), (2, 5), (1, 6), (0, 7), (5, 7), (6, 7), (7, 7), (4, 8)] 
+0

這種情況下的範圍是透鏡(答案[i] [j])是否正確?除了result.append([i,correctCount])之外,我不需要其他任何東西,但是正確的? (正如我們所說的那樣測試) –

+0

不,範圍()與您已有的相同。 – AChampion

+0

非常酷。非常棒的一段代碼,可以壓縮成兩行。 –