【问题描述】jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
给你一个整数数组arr=[37,12,28,9,100,56,80,5,12],请你将数组中的每个元素替换为它们排序后的序号。序号编号的规则如下:jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
①序号从1开始编号。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
②一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
③每个数字的序号都应该尽可能地小。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
输出结果:jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
[5,3,4,2,8,6,7,1,3]jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【题前思考】jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
根据问题描述,填写表4-3-1。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表4-3-1 问题分析jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【解题思路】jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
为了能对不同的数进行唯一性编号,需要删除列表中的重复数据后再对数据排序。然后对排好序的列表进行编号得到各数的序号,以数为键,序号为值构建字典。最后对列表中的每一个数从字典中查找其对应的序号。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【程序代码】jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【代码分析】jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
①:将列表arr转换为集合,又转换为列表,再进行排序。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
set( )函数将列表转换为集合。set(arr)将列表arr转换为集合,因为集合的性质,这个函数会去掉列表中的重复项。在本例中,arr=[37,12,28,9,100,56,80,5,12],执行set(arr)后,得到的结果为{37,12,28,9,100,56,80,5 },去掉了重复值12,集合也用{}括起来。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
list( )是将集合转换为列表。list(set(arr))是将集合set(arr)转化为列表,即转化为[37,12,28,9,100,56,80,5]。将集合转换为列表的目的是为了排序,因为集合是无序的,不能排序。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
sorted( )是对列表进行排序。执行后的列表变为[5,9,12,28,37,56,80,100]。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
②:对列表s中的每个项从1开始编号。enumerate( )函数用于给列表中的每一个项编号,形成一个新的列表,列表中的每一个项为一个元组(序号,项),编号的起始值由函数的第2个参数指定,本例中从1开始,如果未指定第2个参数则默认从0开始编号。在这个程序中,enumerate(s,1)的结果为[(1,5),(2,9),(3,12),(4,28),…],即最小的数为5,第2小的数为9,以此类推。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
③:以项为键,序号为值构成字典dic,见表4-3-2。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表4-3-2 字典dic键与值的对应关系jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
④:表示对arr列表中的每一个项查询其序号,将序号追加到列表res中,见表4-3-3。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表4-3-3 数组元素在字典中的值jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【优化提升】jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
使用字典推导式可以直接生成字典。如语句:jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
用字典推导式可以表示为dic={v:i for i,v in enumerate(s,1)},最后的结果也可以用列表推导式来实现res=[dic[i]for i in arr],在Python中使用推导式的速度比循环要快,所以尽量使用推导式。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【技术全貌】jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
Python中的集合类型同数学中的集合类似,集合是由不同元素组成的,是一组无序排列的值,可作为字典的key。表4-3-4中仅列出了其中常见的方法,全部方法及其说明请扫描二维码查阅文档。jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表4-3-4 集合方法jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
续表jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
jmb100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库