python中的sort用的是什么排序法,python中sort排序是按大小排序吗
Python内置的sort()方法用于排序,Python内置的global sorted()方法也可以用于对迭代序列进行排序,生成新的序列。
1)排序依据
简单的升序排序非常简单。只需调用sorted()方法。它返回一个新列表,其元素根据小于运算符(__lt__)进行排序。
已排序([5,2,3,1,4])
[1, 2, 3, 4, 5]
也可以使用list.sort()方法进行排序,列表本身也会被修改。通常这种方法不如sorted()方便,但是如果不需要保留原始列表的话会更有效。
a=[5,2,3,1,4]
排序()
a
[1, 2, 3, 4, 5]
另一个区别是list.sort()方法只在list中定义,而sorted()方法对所有迭代序列都有效。
已排序({1: D ,2: B ,3: B ,4: E ,5: A})
[1, 2, 3, 4, 5]
2)关键参数/功能
从python2.4开始,list.sort()和sorted()函数增加了一个关键参数来指定在比较每个元素之前调用的函数。例如,通过key指定的函数忽略字符串的大小写:
已排序(“这是来自Andrew的测试字符串”)。split(),key=str.lower)
[a , Andrew , from , is , string , test , This]
关键参数的值是一个函数,它只有一个参数,并返回一个值进行比较。这种技术速度很快,因为key指定的函数将为每个元素准确地调用。
更广泛使用的情况是用复杂对象的一些值对复杂对象的序列进行排序,例如:
student_tuples=[
(《约翰福音》,《答》,15),
( gxdch , B ,12),
(戴夫, B ,10),
]
sorted(student_tuples,key=lambda student: student[2]) #按年龄排序
[(戴夫, B ,10),( gxdch , B ,12),(约翰, A ,15)]
同样的技术也适用于具有命名属性的复杂对象,例如:
班级学生:
def __init__(本人,姓名,年级,年龄):
self.name=name
自我等级=等级
年龄=年龄
def __repr__(self):
return repr((自我姓名,自我等级,自我年龄))
student_objects=[
学生(约翰,甲,15),
学生( gxdch , B ,12),
学生(戴夫, B ,10),
]
sorted(student_objects,key=lambda student:student . age)#按年龄排序
[(戴夫, B ,10),( gxdch , B ,12),(约翰, A ,15)]
3)操作员模块功能
上面的关键参数被广泛使用,所以python提供了一些方便的函数,使得访问方法更加容易和快速。运算符模块包括itemgetter和attrgetter,从2.6开始增加了methodcaller方法。使用这些方法,上述操作将变得更加简洁和快速:
从运算符导入itemgetter,attrgetter
已排序(student_tuples,key=itemgetter(2))
[(戴夫, B ,10),( gxdch , B ,12),(约翰, A ,15)]
已排序(student_objects,key=attrgetter(age ))
[(戴夫, B ,10),( gxdch , B ,12),(约翰, A ,15)]
操作员模块还支持多级排序,例如先按等级排序,再按年龄排序:
已排序(student_tuples,key=itemgetter(1,2))
[(约翰, A ,15),(戴夫, B ,10),( gxdch , B ,12)]
已排序(student_objects,key=attrgetter(grade , age ))
[(约翰, A ,15),(戴夫, B ,10),( gxdch , B ,12)]
4)升序和降序
list.sort()和sorted()都接受参数reverse(True或False)来表示升序或降序排序。例如,上述学生的降序如下:
已排序(student_tuples,key=itemgetter(2),reverse=True)
[(约翰, A ,15),( gxdch , B ,12),(戴夫, B ,10)]
已排序(student_objects,key=attrgetter(age ),reverse=True)
[(约翰, A ,15),( gxdch , B ,12),(戴夫, B ,10)]
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。