题目描述:
小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行 排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。 第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。
输出描述:
输出排序结果,各正整数以空格分割。和小明身高差绝对值最小的小朋友排在前面,和小明身高差绝对值最大的小朋友排在最 后,如果两个小朋友和小明身高差一样,则个子较小的小朋友排在前面。
补充说明:
示例1 输入: 100 10 95 96 97 98 99 101 102 103 104 105
输出: 99 101 98 102 97 103 96 104 95 105
说明: 小明身高100,班级学生10个,身高分别为95 96 97 98 99 101 102 103 104 105,按身高差排序后结果为:99 101 98 102 97 103 96 104 95 105。
#定义排序方法
def sort_student_height(H, heights):
#计算小明与同学们的身高差并存到列表
height_diffs = [(height, abs(H-height)) for height in hrights]
#根据身高差值和原始身高对列表进行排序
sorted_height = sorted(height_diffs, key = lambda x: (x[1], x[0]))
#新建列表提取原始身高排序结果
sorted_students = [student[0] for student in sorted_height]
#返回排序结果
return sorted_students
#输入
H,N = map(int,input().split())
heights = list(map(int,input().split()))
#调用方法
sort_height = sort_student_height(H, heights)
#输出
print(' '.join(map(str, sort_height)))
解题思路:
输入:split()根据空格分离元素,map()把分离后的元素转化为int函数的类型。
方法定义:
首先根据题目分析排序方法:身高差升序排序,绝对值相同则根据原始身高升序排序。
因此首先计算身高差放入列表,再使用sorted()方法对身高差列表进行排序,key作为排序依据,使用lambda函数可以分离排序条件,将身高差列表中元素(元组)的两个排序条件:身高差、原始身高,按照排序逻辑放置,先根据身高差排序(身高差列表中元素(元组)的前一位),身高差相同时则根据原始身高(身高差列表中元素(元组)的后一位)进行排序。
最后对排序后的列表进行提取原始身高操作,取元组中的前一位加入列表。返回原始身高排序后的列表。
输出:空格间断,用join()方法依次将map()转化后的结果列表中的元素添加到空格后