python中列表中有乙個內建方法sort()方法,可以直接對列表進行修改;還有乙個sorted()方法,它會從乙個可迭代物件構建乙個新的列表。
基本排序
簡單的公升序非常簡單,只需呼叫sorted()方法,直接返回乙個新列表
li1 = [3, 1, 8, 39, 4, 89]
li2 = sorted(li1)
print(li2)
# 輸出:[1, 3, 4, 8, 39, 89]
也可以直接使用list.sort(),會直接修改列表
li1 = [3, 1, 8, 39, 4, 89]
li1.sort()
# li2 = sorted(li1)
print(li1)
還有乙個區別,list.sort()方法只是為列表定義的;而sorted()可以對所有可迭代物件進行排序,但只會返回乙個列表
key關鍵字
list.sort()和sorted()都有乙個形參key,來指定在進行比較之前要在每個列表元素呼叫的函式
li = sorted('this is a test string from wang'.split(), key=str.lower)
print(li)
# 輸出:['a', 'from', 'is', 'string', 'test', 'this', 'wang']
key形參的值應該是乙個函式,它接受乙個引數並返回乙個用於排序的鍵,這種技巧很快,因為對於每個輸入記錄只會呼叫一次key函式。
一種常見的操作是使用物件的一些索引作為鍵對複雜物件進行排序
student_tuple = [
('john', 's', '16'),
('tom', '2s', '20'),
('jemmy', 'sb', '18'),
('ming', 'ss', '13')
]print(sorted(student_tuple, key=lambda student: student[2]))
# 輸出:[('ming', 'ss', '13'), ('john', 's', '16'), ('jemmy', 'sb', '18'), ('tom', '2s', '20')]
字典排序
student_info =
print(sorted(student_info.items(), key=lambda x: x[1][1])) # 按照字典值的第二個元素排序
# x相當於字典遍歷出來的乙個鍵值元祖
student_info = [,,
,]print(sorted(student_info, key=lambda key: key['age']))
同樣適用於具有命名屬性的物件
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_tuple = [
student('john', 'a', '14'),
student('tom', 'b', '20'),
student('jemmy', 'b+', '18'),
student('ming', 'b-', '16')
]print(sorted(student_tuple, key=lambda x:x.age))
# 輸出:[('john', 'a', '14'), ('ming', 'b-', '16'), ('jemmy', 'b+', '18'), ('tom', 'b', '20')]
operator模組函式
operator函式包含itemgetter()和attrgetter(),使用這些函式上述例子會更加簡單
from operator import itemgetter
student_tuple = [
('john', 's', '16'),
('tom', '2s', '20'),
('jemmy', 'sb', '18'),
('ming', 'ss', '13')
]print(sorted(student_tuple, key=itemgetter(2)))
student_tuple = [
student('john', 'a', '16'),
student('tom', 'b', '20'),
student('jemmy', 'b+', '18'),
student('ming', 'b-', '16')
]print(sorted(student_tuple, key=attrgetter('age')))
operator模組還允許多級排序,例如按照年齡排序,然後按照名字排序
from operator import itemgetter
student_tuple = [
('john', 's', '16'),
('tom', '2s', '20'),
('jemmy', 'sb', '18'),
('ming', 'ss', '16')
]print(sorted(student_tuple, key=itemgetter(2, 0)))
# 輸出:[('john', 's', '16'), ('ming', 'ss', '16'), ('jemmy', 'sb', '18'), ('tom', '2s', '20')]
公升序和降序
list.sort()和sorted()接受布林值reverse引數,用於標記公升序降序;reverse為true降序,false公升序
排序的穩定性和排序複雜度
排序穩定性指多個元素具有相同的鍵值時,將保留原來的順序
data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
print(sorted(data, key=itemgetter(0)))
# 輸出:[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
這樣就可以允許我們進行一系列排序步驟中構建複雜的排序,例如:要先按照age降序,然後在按照名字公升序 python氣泡排序詳解
要學習氣泡排序必須知道它的原理 氣泡排序演算法的原理如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒...
python 快速排序詳解
快速排序 基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。def quick sort li,start,end 分治 一分為二 start end 證明要處理的資料只有...
堆排序詳解 python實現
1 堆的定義 滿足以下情形的資料結構 情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 左 右子孩子的值比父結點的值都大 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 左 右子孩子的值比父結點的值都小 2 堆排序 一般從小到大的排序利用大頂堆實現。基本思想為 1 將初始待排序...