【编程题训练】统计射击⽐赛成绩
题⽬描述 给定⼀个射击⽐赛成绩单,包含多个选⼿若⼲次射击的成绩分数,请对每个选⼿按其最⾼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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论