程序填空题:力的较量 - 实验16 数据分析之排序 - 《Python编程基础及应用实验教程》 - 高教社
如果一个列表的元素均为某一自定义类实例化的对象,对于这样的列表排序,一般可以通过某个函数,对其成员属性值进行运算,结合key关键字进行排序; 也可以通过类定义时,重写特殊方法__lt__进行对象的比较,然后可直接排序。<br>
请将下述程序补充完整并上机调试,使其可以生成期望的排序结果。
<br>
python
class Force:
def __init__(self,x,y):
self.fx,self.fy = x, y
def show(self):
return "(%f,%f)"%(self.fx,self.fy)
__repr__ = show
def __lt__(self,force2):
return self.fx*self.fx + self.fy*self.fy < force2.fx*force2.fx \
+ force2.fy*force2.fy
fList = [Force(1,2), Force(0,2),Force(3,4),Force(2,1)]
ff = fList.copy()
ff.sort()
print(ff)
ft = sorted(fList,key =lambda x : )
print(ft)
期望的执行结果为:<br>
[(0.000000,2.000000), (1.000000,2.000000), (2.000000,1.000000), (3.000000,4.000000)]
[(0.000000,2.000000), (1.000000,2.000000), (2.000000,1.000000), (3.000000,4.000000)]
【解题提示】
* 定义了一个力的类,希望按力的模(大小)进行排序。类定义重写了__lt__方法,也就是小于(<)关系运算。同时重写了__repr__方法,这样可以直接输出对象。
* __lt__方法的名称源自英文less than。
* 16行代码直接用sort方法对ff列表排序,该排序依赖于对象的特殊方法__lt__。
* 19行代码利用力的属性结合关键字key进行了排序。这里需要填的内容是通过对象成员表示力的模。
* lambda a:a.b表示一个参数为a,返回a对象的属性b作为返回值的匿名函数。
答案:
第1空:x.fx * x.fx + x.fy * x.fy
请将下述程序补充完整并上机调试,使其可以生成期望的排序结果。
<br>
python
class Force:
def __init__(self,x,y):
self.fx,self.fy = x, y
def show(self):
return "(%f,%f)"%(self.fx,self.fy)
__repr__ = show
def __lt__(self,force2):
return self.fx*self.fx + self.fy*self.fy < force2.fx*force2.fx \
+ force2.fy*force2.fy
fList = [Force(1,2), Force(0,2),Force(3,4),Force(2,1)]
ff = fList.copy()
ff.sort()
print(ff)
ft = sorted(fList,key =lambda x : )
print(ft)
期望的执行结果为:<br>
[(0.000000,2.000000), (1.000000,2.000000), (2.000000,1.000000), (3.000000,4.000000)]
[(0.000000,2.000000), (1.000000,2.000000), (2.000000,1.000000), (3.000000,4.000000)]
【解题提示】
* 定义了一个力的类,希望按力的模(大小)进行排序。类定义重写了__lt__方法,也就是小于(<)关系运算。同时重写了__repr__方法,这样可以直接输出对象。
* __lt__方法的名称源自英文less than。
* 16行代码直接用sort方法对ff列表排序,该排序依赖于对象的特殊方法__lt__。
* 19行代码利用力的属性结合关键字key进行了排序。这里需要填的内容是通过对象成员表示力的模。
* lambda a:a.b表示一个参数为a,返回a对象的属性b作为返回值的匿名函数。
答案:
第1空:x.fx * x.fx + x.fy * x.fy