每天开心一点

Python:每日一题 94

2017-11-27 14:49:00    六月    570    来源: http://bbs.fishc.com/thread-96047-1-1.html

要给班上同学的成绩排名次,规则如下:
成绩从高往低排,如果有成绩相同的名次相同,但后续的名次要算前面的总人数。
比如,两个100分的都是第一名,紧接着的99分的是第三名,而不是第二名。

给出一个列表,是全班的成绩:
  1. score = [('A', 80), ('B', 86), ('C', 92), ('D', 87), ('E', 88), ('F', 85),
  2.          ('G', 86), ('H', 89), ('I', 88), ('J', 94), ('K', 94), ('L', 80),
  3.          ('M', 83), ('N', 80), ('O', 88), ('P', 94), ('Q', 82), ('R', 84),
  4.          ('S', 96), ('T', 100), ('U', 82), ('V', 81), ('W', 94), ('X', 81),
  5.          ('Y', 89), ('Z', 92)]
复制代码


要求最后打印出如下的结果:三列分别是名次,姓名和成绩
  1. 1 T 100
  2. 2 S 96
  3. 3 J 94
  4. 3 K 94
  5. 3 P 94
  6. 3 W 94
  7. 7 C 92
  8. 7 Z 92
  9. 9 H 89
  10. 9 Y 89
  11. 11 E 88
  12. 11 I 88
  13. 11 O 88
  14. 14 D 87
  15. 15 B 86
  16. 15 G 86
  17. 17 F 85
  18. 18 R 84
  19. 19 M 83
  20. 20 Q 82
  21. 20 U 82
  22. 22 V 81
  23. 22 X 81
  24. 24 A 80
  25. 24 L 80
  26. 24 N 80
复制代码


我的解法:


  1. score = [('A', 80), ('B', 86), ('C', 92), ('D', 87), ('E', 88), ('F', 85),
  2.          ('G', 86), ('H', 89), ('I', 88), ('J', 94), ('K', 94), ('L', 80),
  3.          ('M', 83), ('N', 80), ('O', 88), ('P', 94), ('Q', 82), ('R', 84),
  4.          ('S', 96), ('T', 100), ('U', 82), ('V', 81), ('W', 94), ('X', 81),
  5.          ('Y', 89), ('Z', 92)]
  6. score.sort(key = lambda i: i[1], reverse = True)
  7. rank = 1
  8. max1 = score[0][1]
  9. for i in range(len(score)):
  10.     if score[i][1] != max1:
  11.         max1 = score[i][1]
  12.         rank = i + 1
  13.     print(rank, score[i][0], score[i][1])
复制代码