sort排序方法
1.排序基础
使用sort()排序方法可以使得对数组进行排序,其方法是定义在list之中,相反的sorted()对于所有的可迭代的序列都有效;
(一)sort循环的之中设置排序的方式:使用erverse参数进行设置(False表示升序;True表示降序)
注意:默认的排序方式为升序
举例(1):
listq = [6,4,5,3,2]
listq.sort()
print(listq)
结果
== RESTART: C:/Users/***/AppData/Local/Programs/Python/Python38/python编程实验.py ==
[2, 3, 4, 5, 6]
>>>
(2)降序:
listq = [6,4,5,3,2]
listq.sort(reverse=True)
print(listq)
结果
== RESTART: C:/Users/***/AppData/Local/Programs/Python/Python38/python编程实验.py ==
[6, 5, 4, 3, 2]
>>>
(二)sorted()函数的使用:
sorted()语法:
sorted(可迭代列表,cmp,key,reverse)
- cmp:由于在Python3.0之中完全的删除了cmp参数,故下面我们不会再讲
- key :主要是用来设置比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse:前面已讲到
举例:
>>> sorted([6,5,3,5,2,1],reverse=True)
[6, 5, 5, 3, 2, 1]
>>>
>>> sorted({6: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
[2, 3, 4, 5, 6]
>>>
注意:这里对字典进行排序的时候想要设置他的所要比较的元素,要通过items来获取他的键值对才能使用key
下面会讲到key的使用;
例如:
错误的方法:
>>> sorted({6: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'},key=lambda x:x[1])
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
sorted({6: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'},key=lambda x:x[1])
File "<pyshell#17>", line 1, in <lambda>
sorted({6: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'},key=lambda x:x[1])
TypeError: 'int' object is not subscriptable
正确的方法:
>>> sorted({6: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}.items(),key=lambda x:x[1])
[(5, 'A'), (2, 'B'), (3, 'B'), (6, 'D'), (4, 'E')]
>>>
2.key参数的使用
注意:key参数主要就是来设置所要进行比较的元素,所以其可迭代列表之中的元素数目必须是>=2的
举例:
>>> student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2])
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>>
key其实还可以对文本的比较方式进行设定:
例如:
>>> sorted("THIS is WHY we PLAY".split(),key=str.lower)
['is', 'PLAY', 'THIS', 'we', 'WHY']
>>> sorted("THIS is WHY we PLAY".split())
['PLAY', 'THIS', 'WHY', 'is', 'we']
>>>
感悟:
其中str.lower表示忽略文本的大小写,但是在平时我们使用时lower()表示将文本改变为小写,所以说key的使用是为了改变文本的比较而不是为了改变文本的内容。
补充:
Python之中提供了一些比较简便的方法来使得key的使用更加的简便,类如itemgetter,attrgetter,其属于operator模块
例如:
>>> class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
>>> student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_tuples,key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
其中itemgetter和我们所用的key的普通书写格式相似,都是用数字表示所要进行排序的对象;
但是对于attrgetter()来说其就要对于所要排序的元素设置对应的名字,通过设置类之中的构造函数来定义相应的元素变量的名字,创建列表的时候就定义复杂对象,使用key.attrgetter()的时候只需要传入相应元素所对应的种类名称,如:
sorted(student_objects, key=attrgetter('age'))
类和对象的使用以及定义我们后面会讲到
当多个元素含有相同的key的时候,其排序的先后顺序和排序之前相同
例:
>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
借鉴文章:https://www.cnblogs.com/ZAmateur/p/12467002.html
https://www.cnblogs.com/whaben/p/6495702.html