【编程题训练】统计射击⽐赛成绩
题⽬描述 给定⼀个射击⽐赛成绩单,包含多个选⼿若⼲次射击的成绩分数,请对每个选⼿按其最⾼3个分数之和进⾏降序排名,输出降序排名后的选⼿ID序列。
lambda编程
条件如下:
1. ⼀个选⼿可以有多个射击成绩的分数,且次序不固定。
2. 如果⼀个选⼿成绩少于3个,则认为选⼿的所有成绩⽆效,排名忽略该选⼿。
3. 如果选⼿的成绩之和相等,则成绩之和相等的选⼿按照其ID降序排列。
输⼊描述:
1. 输⼊第⼀⾏,⼀个整数N,表⽰该场⽐赛总共进⾏了N次射击,产⽣N个成绩分数(2<=N<=100)。
2. 输⼊第⼆⾏,⼀个长度为N整数序列,表⽰参与每次射击的选⼿ID(0<=ID<=99)。
3. 输⼊第三⾏,⼀个长度为N整数序列,表⽰参与每次射击的选⼿对应的成绩(0<=成绩<=100)。
输出描述: 符合题设条件的降序排名后的选⼿ID序列。
⽰例1 输⼊
输出说明该场射击⽐赛进⾏了13次,参赛的选⼿为{3,4,5,7}。 3号选⼿成绩:53,80,55,最⾼3个成绩的和为:80+55+53=188。4号选⼿成绩:24,39,76,66,最⾼3个成绩的和为:76+66+39=181。5号选⼿成绩:53,80,55,最⾼3个成绩的和为:80+55+53=188。7号选⼿成绩:68,16,100,最⾼3个成绩的和为:100+68+16=184。
⽐较各个选⼿最⾼3个成绩的和,有3号=5号>7号>4号,由于3号和5号成绩相等且ID号5>3, 所以输出为:5,3,7,4
参考代码133,3,7,4,4,4,4,7,7,3,5,5,553,80,68,24,39,76,66,16,100,55,53,80,55
1
2
3
4
5,3,7,41
⼼得
1. 循环套循环是可以实现构造⼀个⼀对多的嵌套列表的字典,需要充分利⽤列表键值对的唯⼀性,先在外层循环中创建⼀个新列表,再
在内层循环中到和外层循环值对应的值,添加到列表中,再构造键值对,重复的键值对只会覆盖不会增加
2. 当需要通过元素索引值去反推对应值所在的位置时,不要⽤不具有唯⼀性的元素def  id_grade (N : int , id : list , grade : list ):    dic = {}    # 遍历id,grade 两个列表,将相同id 的成绩存到列表list1中,再利⽤字典键值    # 对的唯⼀性去除重复创建的list1,只保留不同id 对应的成绩列表。    for  i in  range (N ):        list1 = []        for  j in  range (N ):            if  id [j ] == id [i ]:                list1.append (grade [j ])        dic [id [i ]] = list1    keys_list = list (dic .keys ())    values_list = list (dic .values ())    '''遍历所有成绩列表,除掉成绩数不⾜三次列表,如果超过三次则降序排列取    前三次成绩再求和(ps :这⾥遍历的时候注意要⽤索引值做循环,不可以循环列    表,因为如果两个选⼿的最终成绩⼀样,最后修改字典是需要根据成绩对应的索    引值去到相同索引值得键值去进⾏修改,但成绩不具备唯⼀性,反推的索引值    可能不准确)'''    for  k in  range (len (values_list )):        if  len (values_list [k ]) < 3:            dic .pop (keys_list [k ])        else :            values_list [k ].sort (reverse =True )            value = sum (val
ues_list [k ][:3])            dic [keys_list [k ]] = value    # 错误代码    # for k in values_list:    #    if len(k) < 3:    #        dic.pop(k)    #    else:    #        k.sort(reverse=True)    #        value = sum(k[:3])    #        dic[keys_list[values_list.index(k)]] = value    list2 = sorted (dic .items (), key =lambda  x : (x [1], x [0]), reverse =True )    list3 = [str (l [0]) for  l in  list2]    return  ','.join (list3)assert  id_grade (13, [3, 3, 7, 4, 4, 4, 4, 7, 7, 3, 5, 5, 5],                [53, 80, 68, 24, 39, 76, 66, 16, 100, 55, 53, 80, 55]) == '5,3,7,4'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39