2016-11-19 97 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

非常酷。非常棒的一段代码,可以压缩成两行。 –