sort排序方法
1.排序基礎(chǔ)
使用sort()排序方法可以使得對數(shù)組進(jìn)行排序,其方法是定義在list之中,相反的sorted()對于所有的可迭代的序列都有效;
(一)sort循環(huán)的之中設(shè)置排序的方式:使用erverse參數(shù)進(jìn)行設(shè)置(False表示升序;True表示降序)
注意:默認(rèn)的排序方式為升序
舉例(1):
listq = [6,4,5,3,2]
listq.sort()
print(listq)
結(jié)果
== 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)
結(jié)果
== RESTART: C:/Users/***/AppData/Local/Programs/Python/Python38/python編程實驗.py ==
[6, 5, 4, 3, 2]
>>>
(二)sorted()函數(shù)的使用:
sorted()語法:
sorted(可迭代列表,cmp,key,reverse)
- cmp:由于在Python3.0之中完全的刪除了cmp參數(shù),故下面我們不會再講
- key :主要是用來設(shè)置比較的元素,只有一個參數(shù),具體的函數(shù)的參數(shù)就是取自于可迭代對象中,指定可迭代對象中的一個元素來進(jìn)行排序。
- 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]
>>>
注意:這里對字典進(jìn)行排序的時候想要設(shè)置他的所要比較的元素,要通過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參數(shù)的使用
注意:key參數(shù)主要就是來設(shè)置所要進(jìn)行比較的元素,所以其可迭代列表之中的元素數(shù)目必須是>=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其實還可以對文本的比較方式進(jìn)行設(shè)定:
例如:
>>> 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()表示將文本改變?yōu)樾?,所以說key的使用是為了改變文本的比較而不是為了改變文本的內(nèi)容。
補(bǔ)充:
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的普通書寫格式相似,都是用數(shù)字表示所要進(jìn)行排序的對象;
但是對于attrgetter()來說其就要對于所要排序的元素設(shè)置對應(yīng)的名字,通過設(shè)置類之中的構(gòu)造函數(shù)來定義相應(yīng)的元素變量的名字,創(chuàng)建列表的時候就定義復(fù)雜對象,使用key.attrgetter()的時候只需要傳入相應(yīng)元素所對應(yīng)的種類名稱,如:
sorted(student_objects, key=attrgetter('age'))
類和對象的使用以及定義我們后面會講到
當(dāng)多個元素含有相同的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