【问题描述】
有区间列表[(0,5),(-2,7),(3,9),(-5,-1),(12,20)],每个区间由元组表示,元组的第一个元素表示左边界,第二个元素表示右边界,请编写程序对列表中的区间按左边界升序排序。
输出结果:
[(-5,-1),(-2,7),(0,5),(3,9),(12,20)]
【题前思考】
根据问题描述,填写表5-1-3。
表5-1-3 问题分析
【解题思路】
Python的内置函数sorted( )或列表的方法sort( )都可以排序。这两个函数都提供了参数key用于指定排序的依据,key是一个函数,作用是从被排序数据中获得基本类型的数据用于排序。在这个问题中,被排序的数据是用元组表示的区间,所以需要定义一个函数getleft( ),从元组中取得表示左边界的数据,然后根据getleft( )函数返回数据排序。参数reverse=False表示升序,反之表示降序,默认值为False。
【程序代码】
【代码分析】
①:函数getleft( )的作用就是返回参数(表示区间的元组)的第1个元素,所以函数体只有一条语句return a[0]。
②:将getleft传递给参数key,调用列表a的sort方法为列表排序。排序的基本操作就是对列表中的元素进行比较和移动。比较的时候,该方法内部会调用key( )函数(此例中key被赋值为getleft( )从被排序数据中取得基本类型的数据进行比较,此例就是用区间的左边界进行排序。
【优化提升】
上例中的函数非常简单,仅返回一个值,为了简化程序,Python中引入了lambda表达式来表示这种简单函数。如上例中的函数getleft( )就可以表示为getleft=lambda a:a[0]。冒号前是参数,冒号后是返回值。用lambda表达式重写区间排序的程序如下:
print(sorted([(0,5),(-2,7),(3,9),(-5,-1),(12,20)],key=lambda x:x[0]))